【问题标题】:Serilog Elasticsearch logs not making it to the server (but buffering correctly)Serilog Elasticsearch 日志未发送到服务器(但正确缓冲)
【发布时间】:2020-01-16 22:12:42
【问题描述】:

我在 Windows IIS Web 服务器上本地托管了一个 ELK 堆栈 (v7.0),但日志没有发送到服务器。服务器正在运行,我可以访问保留的 URL 并取回通用 json 包,说 Elasticsearch 正在运行,我可以很好地登录 Kibana,只是没有日志可看。

我在正在记录的应用程序中设置了一个 bufferBaseFilename,当我转到该位置时,日志实际上就在那里,并正确编入索引。我想知道为什么它永远不会同步回服务器?这似乎是一个连接问题,但所有的网络东西都检查出来了。我可能错过了一些简单的东西。有什么想法吗?如果您需要更多信息,请告诉我!

【问题讨论】:

  • 可能是你错误配置了sink,请提供Elasticsearch sink配置。您也可以尝试使用 Serilog 的 SelfLog,很有可能您会在其中看到相应的错误:github.com/serilog/serilog/wiki/Debugging-and-Diagnostics
  • 配置为 nodeUris: "log.company.pvt/[appname]/host" | indexFormat:"[appname]-prod" |模板名称:“[应用名称]-prod”| minimumLogEventLevel: "信息" | bufferBaseFilename:“C:\Temp[Appname] 临时日志\”。如果您想查看使用这些设置的配置代码,请告诉我,我会用它来编辑帖子。感谢您提供有关 Selflog 的提示,今天将尝试一下!
  • @Inok 刚刚试用了 Selflog,每次调用日志都会收到 Received failed ElasticSearch shipping result 400: System.Collections.Generic.Dictionary'2[System.String,System.Object]. Failed payload。这是否意味着它无法到达服务器?
  • 看起来服务器是可以访问的。可能是日志条目有问题,但必须有一些数据而不是Dictionary'2Failed payload 之后。你使用最新版本的serilog.sinks.elasticsearch 包吗?如果没有,请尝试更新它(此时为 8.0.1),并尝试显式引用最新版本的 Elasticsearch.Net 包(7.5.1)。它可能无法解决问题,但它必须使 SelfLog 中的错误信息更丰富。此外,清除缓冲区文件,或者最好禁用缓冲,直到问题得到解决。
  • @Inok 日志消息还有更多内容,只是不想打破字符限制。它包含了整个信息。如果看到让我知道会有所帮助,则需要先对其进行消毒。我还在服务器上安装了wireshark,发现了一些有趣的东西,[Reassembly error, protocol TCP: New fragment overlaps old data (retransmission?)] 来自我的客户端的 ACK 数据包。

标签: .net elasticsearch logging kibana serilog


【解决方案1】:

此错误的常见来源是与您的 ES 版本不匹配的格式错误(模板)请求(例如,包含不推荐使用的字段)。你可以试试

  • 使用the nuget package的预览版
  • DetectElasticsearchVersion 设置为true
  • RegisterTemplateFailure 设置为IndexAnyway

您可以像这样配置接收器:

var loggerConfig = new LoggerConfiguration()
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri(...) ){
        // ...
        DetectElasticsearchVersion = true,
        RegisterTemplateFailure = RegisterTemplateFailure.IndexAnyway
     });

【讨论】:

  • 感谢您的回复!我无法让 alpha 包工作(更新到它,但是当我运行时我得到 FileLoadException: Could not load file or assembly 'Serilog.Sinks.Elasticsearch, Version=8.0.1.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)。对于其他 2 个选项,我在哪里设置这些值?在接收器配置中?
  • @Hershizer33 看起来您有其他依赖项引用了不同的版本/未正确恢复包/缺少或错误的程序集重定向...您可以分享您的项目吗?对于配置部分:我更新了我的答案。
  • @Hershizer33 是的,自动检测也应该解决这个问题。对于 ES sink,支持多个 ES 版本是一个设计决策。这意味着需要将其包含在配置中。 ES 团队自己选择了不同的方式:你必须为每个主要版本使用不同的 nuget 包。无论哪种方式:更新你的 ES 堆栈意味着接触代码?‍♂️
  • 我选择了Detect... = true...Version = <my expected version>,但您的建议似乎也有效。
  • 将此标记为答案,即使它已在 cmets 中解决。谢谢!
猜你喜欢
  • 2021-12-10
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2020-09-26
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2019-11-09
相关资源
最近更新 更多