我有一些由Log4J2生成的日志文件。我使用log4j2.xml配置文件中的JSONLayout将日志输出到.json文件中。我的JSONLayout定义如下:
<JSONLayout complete="false"></JSONLayout>
当日志被输入到我机器上的日志文件中时,它们被一个接一个地附加,在logs.log:中看起来像这样
{
"logger":"com.mycompany.myLogger",
"timestamp":"1396792374326",
"level":"ERROR",
"thread":"pool-2-thread-2",
"message":"System: unable to perform action",
"throwable":"java.lang.NullPointerException\ntat com.myCompany.MyClass $.java:432)\ntat java.lang.Thread.run(Thread.java:744)\n"
},
我正在尝试构建这个JSON,以便从ElasticSearch中查询它。在这个过程中,我试图向所有记录添加一个自定义字段。为此,我使用以下方法:
input {
file {
type => "json"
path => "/var/logs/myApp/logs.log"
}
}
filter {
json {
add_tag => [ "HardcodedTagName"]
source => "message"
}
}
output {
elasticsearch {
protocol => "http"
codec => "json"
host => "[myServerAddress]"
port => "9200"
}
}
奇怪的是,我的自定义标签似乎从未被添加。同时,我真的很想把我的JSON分解成可以在ElasticSearch中查询的字段。我想查询的东西都很清楚。它们是:
- 水准仪
- 消息
- 时间戳
然而,我似乎无法得到这些信息。当我在Kibana中看到JSON记录时,我只看到这样的东西:
{
"_index": "logstash-2014.04.07",
"_type": "json",
"_id": "tG-s6-5pSnq5HZwLhM6Dxg",
"_score": null,
"_source": {
"message": " "message":"System: unable to perform action"r",
"@version": "1",
"@timestamp": "2014-04-07T18:01:38.739Z",
"type": "json",
"host": "ip-MyipAddress",
"path": "/var/logs/myApp/logs.log"
},
"sort": [
1396893698739,
1396893698739
]
}
最让我惊讶的是,日志级别根本不存在。线程信息也是如此。我很惊讶,我找不到一篇使用过滤器的Log4J示例的博客文章。衷心感谢您的帮助!
您不需要使用json过滤器。您可以在输入处指定编解码器格式。
input {
file {
type => "json"
path => "/var/logs/myApp/logs.log"
codec => json
}
}
Logstash会自动将您的日志解析为json格式,并添加相应的字段。