带LogStash的JSON变种(Log4J)

时间:2014-04-08 17:29:00

标签: json log4j logstash

我不确定这是this one的后续问题还是单独问题。 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生成的属性。这里可以看到一个记录的例子:

{"message":"Danger. There was an error","@version":"1","@timestamp":"2014-04-08T17:20:10.035Z","type":"log4j","host":"ip-myAddress","path":"/logs/mylogs.log"}

有时我甚至会得到解析错误。我需要我的属性仍然是属性。我不希望它们塞进消息部分或输出中。我有预感,这与Codecs有关。但是,我不确定。我不确定是否应该更改logstash输入配置上的编解码器。或者,如果我应该更改输出配置的输入。我真诚地感谢任何帮助,因为我现在已经绝望了。

4 个答案:

答案 0 :(得分:1)

您可以更改日志格式吗?

将日志格式更改为

{ "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日志,并且在日志末尾没有",#34; ,我可以使用下面的配置将json消息解析为对应字段。

input {
    file {
       type => "log4j"
       path => "/logs/mylogs.log"
       codec => json
    }
}

答案 1 :(得分:0)

input {
    file {
        codec => json_lines { charset => "UTF-8" }
        ...
    }
}

应该做的伎俩

答案 2 :(得分:0)

使用Logstash的log4j输入。

http://logstash.net/docs/1.4.2/inputs/log4j

应该是这样的:

input {
    log4j {
        port => xxxx
    }
}

这对我有用,祝你好运!

答案 3 :(得分:0)

我认为@Ben Lim是对的,你的Logstash配置很好,只需要正确格式化输入JSON就可以将每个日志事件放在一行中。使用Log4J2的JsonLayout非常简单,只需设置eventEol=truecompact=true即可。 (reference