我在这里想到了.我有一个将日志写入文件的应用程序.每个日志条目都是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输入配置上的编解码器.或者,如果我应该更改输出配置的输入.我真诚地感谢任何帮助,因为我现在已经绝望了.
谢谢.
尝试删除json编解码器并添加json过滤器
input { file { type => "json" path => "/logs/mylogs.log" } } filter{ json{ source => "message" } } output { file { path => "/logs/out.log" } }
您不需要json编解码器,因为您不想解码源JSON,但您希望过滤输入以仅在@message字段中获取JSON数据.
希望这可以帮助.
默认情况下,如果未指定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.
我们可以删除像消息一样的冗余字段
filter { json { source => "message" remove_field => ["message"] } }