【问题标题】:Why do I get partial log message in Kibana from NLog FileTarget?为什么我会从 NLog FileTarget 在 Kibana 中获得部分日志消息?
【发布时间】:2020-05-12 05:08:47
【问题描述】:

我正在使用 NLog FileTarget 将消息记录在一个文件中,该文件被 filebeat 拾取并发送到 Kibana。

我的消息通常是多行的。

我注意到一些消息显示在 Kibana 中,多行消息中只有 一些行。

例如,在日志中我有这样的东西

2020-05-04 16:23:16.1523|::1|80000037-0000-fb00-b63f-84710c7967bb
    2020-05-04 16:23:16.1523|::1|80000037-0000-fb00-b63f-84710c7967bb||INFO|Microsoft.AspNetCore.Hosting.Diagnostics|Request starting HTTP/2.0 GET https://localhost:44328/Foo   
    2020-05-04 16:23:16.2287|::1|80000037-0000-fb00-b63f-84710c7967bb|user1|DEBUG|MyApp.Web.Controllers.FooController|Validation OK
    2020-05-04 16:23:16.2530|::1|80000037-0000-fb00-b63f-84710c7967bb|user1|DEBUG|MyApp.Web.BusinessLogic.FooLogic|Query results time:3ms 
    2020-05-04 16:23:16.2687|::1|80000037-0000-fb00-b63f-84710c7967bb|user1|DEBUG|MyApp.Web.BusinessLogic.FooLogic|Count:0 time:1ms 
    2020-05-04 16:23:16.6127|::1|80000037-0000-fb00-b63f-84710c7967bb|user1|INFO|Microsoft.AspNetCore.Hosting.Diagnostics|Request finished in 459.4438ms 200 text/html; charset=utf-8 

但在 kibana 我只看到

2020-05-04 16:23:16.1523|::1|80000037-0000-fb00-b63f-84710c7967bb
    2020-05-04 16:23:16.1523|::1|80000037-0000-fb00-b63f-84710c7967bb||INFO|Microsoft.AspNetCore.Hosting.Diagnostics|Request starting HTTP/2.0 GET https://localhost:44328/Foo   
    2020-05-04 16:23:16.2287|::1|80000037-0000-fb00-b63f-84710c7967bb|user1|DEBUG|MyApp.Web.Controllers.FooController|Validation OK
    2020-05-04 16:23:16.2530|::1|80000037-0000-fb00-b63f-84710c7967bb|user1|DEBUG|MyApp.Web.BusinessLogic.FooLogic|Query results time:3ms 

请注意,这只发生在 一些 消息中,而不是全部,并且日志消息的大小似乎并不重要。我已经记录了很长的消息,而较小的消息被裁剪了。

我能想到的唯一原因是消息不是一口气写的,而是分部分写的,kibana 拿起部分消息而忽略了其余部分。是这样吗?如果是这样,我可以将目标配置为一次性写入所有消息吗?

我的堆栈是:

  • .NET Core 3.1
  • C#
  • NLog 4.7.0
  • NLog.Web.AspNetCore 4.9.2

我的文件目标配置如下:

"target": {
  "type": "File",
  "fileName": "c:\\wwwlogs\\MyApp.Web\\Combined.log",
  "archiveFileName": "c:\\wwwlogs\\MyApp.Web\\archives\\Combined.{#}.log",
  "archiveEvery": "Day",
  "archiveNumbering": "Rolling",
  "maxArchiveFiles": "7",
  "layout": "${longdate}|${aspnet-request-ip}|${aspnet-TraceIdentifier}|${aspnet-user-identity}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}"
}

FileBeat 配置为:

- type: log
  enabled: true
  paths:
    - C:\wwwlogs\MyApp.Web\Combined.log
  multiline.pattern: '^[[:space:]]'
  multiline.negate: false
  multiline.match: after

【问题讨论】:

  • 为什么不使用 NLog JsonLayout 以 Json 格式输出:github.com/nlog/nlog/wiki/JsonLayout
  • 好吧,但这并不能真正回答问题,是吗?无论如何,关于“为什么不”,一个原因是我的自定义目标是为使用简单布局而构建的,因此还有更多工作要做。如果我得到关于问题存在原因的明确答案,并且没有办法使用简单布局来解决它,我会考虑它。但是,最好不要在那之前。
  • @RolfKristensen 如果我要继续进行上述操作,我的 filebeat 配置应该是什么样的,所以我最终会在 kibana 中显示与现在相同的消息?
  • 可能对所有控制真正 json 格式的 Kibana 众神犯下罪行。但也许它可以给你一个开始(在下面添加答案)

标签: kibana nlog filebeat


【解决方案1】:

令人尴尬,但事实证明这不是问题。整个消息被 filebeat 拾取,但仅部分显示在 Kibana 索引视图上。如果单击消息详细信息,则可以看到整条消息。

所以,NLog 和 filebeat 没有问题,这是 Kibana 中的视图问题

【讨论】:

    【解决方案2】:

    不是 FileBeat 方面的专家,但在阅读了文档后:

    https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html#filebeat-input-log-config-json

    然后看起来你可以这样做:

    - type: log
      enabled: true
      paths:
        - C:\wwwlogs\MyApp.Web\Combined.log
      input_type: log
      json.message_key: msg
      json.keys_under_root: false
      json.add_error_key: true
      json.overwrite_keys: false
    

    然后你可以用 NLog JsonLayout 做到这一点:

    "target": {
      "type": "File",
      "fileName": "c:\\wwwlogs\\MyApp.Web\\Combined.log",
      "archiveFileName": "c:\\wwwlogs\\MyApp.Web\\archives\\Combined.{#}.log",
      "archiveEvery": "Day",
      "archiveNumbering": "Rolling",
      "maxArchiveFiles": "7",
      "layout": {
          "type": "JsonLayout",
            "Attributes": [
            {
              "name": "time",
              "layout": "${date:format=o}"
            },
            {
              "name": "lvl",
              "layout": "${level}"
            },
            {
              "name": "logger",
              "layout": "${logger}"
            },
            {
              "name": "msg",
              "layout": "${message}"
            },
            {
              "name": "req_traceid",
              "layout": "${aspnet-TraceIdentifier}"
            },
            {
              "name": "req_user",
              "layout": "${aspnet-user-identity}"
            },
            {
              "name": "req_ip",
              "layout": "${aspnet-request-ip}"
            },
            {
              "name": "error_type",
              "layout": "${exception:format=type}"
            },
            {
              "name": "exception",
              "layout": "${exception:format=tostring}"
            },
            {
              "name": "properties",
              "encode": false,
              "layout": {
                "type": "JsonLayout",
                "includeallproperties": "true"
              }
            }]
       }
    }
    

    【讨论】:

    • 我可能会这样做,但有助于在 kibana 中提取。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2017-02-11
    • 2018-02-03
    • 2021-07-11
    • 1970-01-01
    相关资源
    最近更新 更多