我在这里忘记了。我有一个将日志写入文件的应用程序。每个日志条目都是JSON对象。我的.json文件的示例如下所示:
{"Property 1":"value A","Property 2":"value B"}
{"Property 1":"value x","Property 2":"value y"}
我正拼命地将日志条目放入LogStash。为了做到这一点,我创建了以下LogStash配置文件:
input {
file {
type => "json"
path => "/logs/mylogs.log"
codec => "json"
}
}
output {
file {
path => "/logs/out.log"
}
}
现在,我正在手动将记录添加到mylogs.log以尝试使其正常工作。但是,它们在标准输出中显得很奇怪。当我打开out.log时,我看到如下内容:
{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","@version":"1","@timestamp":"2014-04-08T15:33:07.519Z","type":"json","host":"ip-[myAddress]","path":"/logs/mylogs.log"}
因此,如果我将消息发送给ElasticSearch,我就不会得到这些字段。相反,我得到了混乱。我需要我的属性仍然是属性。我不希望它们塞进消息部分或输出中。我有预感,这与Codecs有关。但是,我不确定。我不确定是否应该更改logstash输入配置上的编解码器。或者,如果我应该更改输出配置的输入。我真诚地感谢任何帮助,因为我现在已经绝望了。
感谢。
答案 0 :(得分:37)
尝试删除json codec并添加json filter
input {
file {
type => "json"
path => "/logs/mylogs.log"
}
}
filter{
json{
source => "message"
}
}
output {
file {
path => "/logs/out.log"
}
}
您不需要json编解码器,因为您不想解码源JSON,但您希望过滤输入以仅在@message字段中获取JSON数据。
希望这有帮助。
答案 1 :(得分:9)
默认情况下,如果未指定json编解码器,tcp会将所有内容放入消息字段。
在指定json编解码器后,消息字段的 _jsonparsefailure 的解决方法也可以通过执行以下操作来纠正:
input {
tcp {
port => '9563'
}
}
filter{
json{
source => "message"
target => "myroot"
}
json{
source => "myroot"
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
它将消息字段解析为正确的json字符串到字段myroot 然后解析myroot以产生json。
我们可以将 message 等冗余字段删除为
filter {
json {
source => "message"
remove_field => ["message"]
}
}
答案 2 :(得分:1)
尝试这个:
filter {
json {
source => "message"
target => "jsoncontent" # with multiple layers structure
}
}