Почему я получаю частичное сообщение журнала в Kibana от NLog FileTarget? - PullRequest
0 голосов
/ 08 мая 2020

Я использую NLog FileTarget для регистрации сообщений в файле, который подбирается файловым битом для отправки в Kibana.

Мои сообщения часто многострочные.

Я заметил, что некоторые сообщения отображаются в Kibana обрезанными, только некоторые строк в многострочном сообщении.

Например, в журнале ie У меня что-то вроде этого

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 

но в кибане я вижу только

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 

Обратите внимание, что это происходит только для некоторых сообщений, а не всех, и размер сообщения журнала не имеет значения. У меня были довольно длинные сообщения, записанные целиком, в то время как более мелкие были обрезаны. частичное сообщение, а остальные игнорирует. Так ли это? Если да, могу ли я настроить цель на запись сообщения сразу?

Мой стек:

  • . 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

Ответы [ 2 ]

2 голосов
/ 11 мая 2020

Смущает, но оказывается, что это не проблема. Все сообщение было перехвачено filebeat, но только частично отображалось в индексном представлении Kibana. Если щелкнуть сведения о сообщении, будет видно все сообщение.

Итак, нет проблем с NLog и filebeat, это проблема просмотра в Kibana

0 голосов
/ 12 мая 2020

Не знаток 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"
          }
        }]
   }
}
...