为什么我在 Kibana 中从 NLog FileTarget 获取部分日志消息?
Why do I get partial log message in Kibana from NLog FileTarget?
我正在使用 NLog FileTarget 将消息记录到一个文件中,该文件会被 filebeat 拾取并发送到 Kibana。
我的消息经常是多行的。
我注意到一些消息在 Kibana 中显示为被剪裁,多行消息中只有 一些 行。
比如logfie中我有这样的东西
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 核心 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
尴尬,但事实证明这不是问题。整个消息被 filebeat 获取,但仅部分显示在 Kibana 索引视图中。如果单击消息详细信息,则可以看到整个消息。
所以,NLog 和 filebeat 没有问题,这是 Kibana 中的视图问题
不是 FileBeat 专家,但阅读文档后:
那么看起来你可以这样做:
- 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"
}
}]
}
}
我正在使用 NLog FileTarget 将消息记录到一个文件中,该文件会被 filebeat 拾取并发送到 Kibana。
我的消息经常是多行的。
我注意到一些消息在 Kibana 中显示为被剪裁,多行消息中只有 一些 行。
比如logfie中我有这样的东西
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 核心 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
尴尬,但事实证明这不是问题。整个消息被 filebeat 获取,但仅部分显示在 Kibana 索引视图中。如果单击消息详细信息,则可以看到整个消息。
所以,NLog 和 filebeat 没有问题,这是 Kibana 中的视图问题
不是 FileBeat 专家,但阅读文档后:
那么看起来你可以这样做:
- 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"
}
}]
}
}