如何在Logstash中解析json格式的日志消息以获取某个键/值对?

时间:2016-09-01 21:24:44

标签: logstash logstash-configuration

我将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?

1 个答案:

答案 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以节省空间。