我将json格式的日志发送到我的Logstash服务器。日志看起来像这样(注意:整个消息真的在一行,但我用多行显示以方便阅读)
2016-09-01T21:07:30.152Z 153.65.199.92
{
"type":"trm-system",
"host":"susralcent09",
"timestamp":"2016-09-01T17:17:35.018470-04:00",
"@version":"1",
"customer":"cf_cim",
"role":"app_server",
"sourcefile":"/usr/share/tomcat/dist/logs/trm-system.log",
"message":"some message"
}
我需要在Logstash配置中放入什么来获取“sourcefile”值,并最终获取文件名,例如trm-system.log?
答案 0 :(得分:1)
如果你将哈希字段(没有时间戳)抽入ES,它应该识别它。
如果你想在logstash管道中执行它,你可以使用json filter并将source =>
指向该行的第二部分(可能会添加时间戳前缀)。
这会导致所有字段都添加到当前消息中,您可以直接访问它们或全部组合:
配置:
input { stdin { } }
filter {
# split line in Timestamp and Json
grok { match => [ message , "%{NOTSPACE:ts} %{NOTSPACE:ip} %{GREEDYDATA:js}"] }
# parse json part (called "js") and add new field from above
json { source => "js" }
}
output {
# stdout { codec => rubydebug }
# you access fields directly with %{fieldname}:
stdout { codec => line { format => "sourcefile: %{sourcefile}"} }
}
样品运行
2016-09-01T21:07:30.152Z 153.65.199.92 { "sourcefile":"/usr" }
sourcefile: /usr
并使用rubydebug(删除了host和@timestamp):
{
"message" => "2016-09-01T21:07:30.152Z 153.65.199.92 { \"sourcefile\":\"/usr\" }",
"@version" => "1",
"ts" => "2016-09-01T21:07:30.152Z",
"ip" => "153.65.199.92",
"js" => "{ \"sourcefile\":\"/usr\" }",
"sourcefile" => "/usr"
}
如您所见,字段sourcefile
与rubydebug输出中的值直接相关。
根据日志记录的来源,您可能还需要使用multiline
编解码器。您可能还想删除js
字段,将@timestamp
重命名为_parsedate
并将ts
解析为记录时间戳(让Kibana感到高兴)。这未在样本中显示。我还会删除message
以节省空间。