我不确定这是这个问题的后续问题还是单独的问题。有一些关于 LogStash 的文章没有点击。为此,我为一个相关的问题道歉。不过,我还是要在这里疯了。
我有一个将日志写入文件的应用程序。每个日志条目都是一个 JSON 对象。我的 .json 文件示例如下所示:
{
"logger":"com.myApp.ClassName",
"timestamp":"1456976539634",
"level":"ERROR",
"thread":"pool-3-thread-19",
"message":"Danger. There was an error",
"throwable":"java.Exception"
},
{
"logger":"com.myApp.ClassName",
"timestamp":"1456976539649",
"level":"ERROR",
"thread":"pool-3-thread-16",
"message":"I cannot go on",
"throwable":"java.Exception"
}
这种格式是从 Log4J2 的 JsonLayout 创建的。我正在尽我最大的努力将日志条目放入 LogStash。为此,我创建了以下 LogStash 配置文件:
input {
file {
type => "log4j"
path => "/logs/mylogs.log"
}
}
output {
file {
path => "/logs/out.log"
}
}
当我打开/logs/out.log 时,我看到一团糟。有 JSON。但是,我没有看到 Log4J 生成的"level"属性或"线程"属性。可以在此处查看记录示例:
{"message":"Danger. There was an error","@version":"1","@timestamp":"2014-04-08T17:20:10.035Z","type":"log4j","host":"ip-myAddress","path":"/logs/mylogs.log"}
有时我甚至会收到解析错误。我需要我的属性仍然是属性。我不希望它们塞进消息部分或输出中。我有一种预感,这与编解码器有关。然而,我不确定。我不确定我是否应该更改 logstash 输入配置上的编解码器。或者,如果我应该更改输出配置的输入。我将真诚地感谢任何帮助,因为我此时已经绝望了。
您可以更改日志格式吗?
在我将您的日志格式更改为
{ "logger":"com.myApp.ClassName", "timestamp":"1456976539634", "level":"ERROR", "thread":"pool-3-thread-19", "message":"Danger. There was an error", "throwable":"java.Exception" }
{ "logger":"com.myApp.ClassName", "timestamp":"1456976539649", "level":"ERROR", "thread":"pool-3-thread-16", "message":"I cannot go on", "throwable":"java.Exception" }
每行一个 json 日志,日志末尾没有",",我可以使用下面的配置来解析 json 消息以对应字段。
input {
file {
type => "log4j"
path => "/logs/mylogs.log"
codec => json
}
}
input {
file {
codec => json_lines { charset => "UTF-8" }
...
}
}
应该做这个技巧
使用 Logstash 的 log4j 输入。
http://logstash.net/docs/1.4.2/inputs/log4j
应该看起来像这样:
input {
log4j {
port => xxxx
}
}
这对我有用,祝你好运!
我认为@Ben Lim是对的,您的Logsash配置很好,只需要正确格式化输入JSON即可将每个日志事件放在一行中。使用Log4J2的JsonLayout非常简单,只需设置eventEol=true
和compact=true
即可。(参考资料)