2016-07-08 82 views
0

我正在使用Logstash来读取某些日志文件。 这里有一些数据源的记录Logstash Grok分析问题

<2016-07-07 00:31:01> Start 
<2016-07-07 00:31:59> Warning - Export_Sysem 6 (1) => No records to be exported 
<2016-07-07 00:32:22> Export2CICAP (04) => Export PO : 34 record(s) 
<2016-07-07 00:32:22> Export2CICAP (04) => Export CO : 87 record(s) 
<2016-07-07 00:32:22> Export2CICAP (04) => Export FC 

这是我的conf文件

grok{ 
    match => {"message" => [ 
    '<%{TIMESTAMP_ISO8601:Timestamp}> (%{WORD:Level} -)%{NOTSPACE:Job_Code} => %{GREEDYDATA:message}',  
    '<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Parameter} - %{GREEDYDATA:Message}', 
    '<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Status}', 
    ]} 
} 

这是我的输出

{ 
     "message" => "??2016-07-07 00:31:01> Start\r?", 
     "@version" => "1", 
    "@timestamp" => "2016-07-08T03:22:01.076Z", 
      "path" => "C:/CIGNA/Export.log", 
      "host" => "SIMSPad", 
      "type" => "txt", 
      "tags" => [ 
     [0] "_grokparsefailure" 
    ] 
} 
{ 
     "message" => "<2016-07-07 00:31:59> Warning - Export_Sysem 6 (1) => No records to be exported\r?", 
     "@version" => "1", 
    "@timestamp" => "2016-07-06T16:31:59.000Z", 
      "path" => "C:/CIGNA/Export.log", 
      "host" => "SIMSPad", 
      "type" => "txt", 
    "Timestamp" => "2016-07-07 00:31:59", 
    "Parameter" => "Warning", 
     "Message" => "Export_Sysem 6 (1) => No records to be exported\r?" 
} 
{ 
     "message" => "<2016-07-07 00:32:22> Export2CICAP (04) => Export CO : 87 record(s)\r?", 
     "@version" => "1", 
    "@timestamp" => "2016-07-06T16:32:22.000Z", 
      "path" => "C:/CIGNA/Export.log", 
      "host" => "SIMSPad", 
      "type" => "txt", 
    "Timestamp" => "2016-07-07 00:32:22", 
     "Status" => "Export2CICAP" 
} 

由于从输出看到,第一输出消息的一部分有一个grok解析错误,其他2个结果没有完全解析消息。我应该如何修改grok语句,以便它可以完全解析消息?

回答

1

对于第一条消息,问题来自两个??,它们没有出现在该模式中,因此创建了_grokparsefailure

第二个和第三个消息没有完全解析,因为前两个模式与消息不匹配,所以消息由最后一个模式解析。

对于第二个消息,如果你想与第一图案(<%{TIMESTAMP_ISO8601:Timestamp}> (%{WORD:Level} -)%{NOTSPACE:Job_Code} => %{GREEDYDATA:message})来解析它,你的模式是错误的:

  • ()各地%{WORD:Level} -没有在日志中出现。
  • :Timestamp}>%{WORD:Level}之间没有空格。在日志中,模式中有两个并且只有一个。请注意,您可以使用%{SPACE}来避免这一问题没有任何空格字符的序列(因为%{SPACE}将匹配任何数量的空格)
  • %{NOTSPACE:Job_Code}比赛,但在Export_Sysem 6 (1)的空间,所以Job_CodeExport_Sysem=>中的模式将阻止与第一个模式的成功匹配。

正确模式:

<%{TIMESTAMP_ISO8601:Timestamp}> %{WORD:Level} - %{DATA:Job_Code} => %{GREEDYDATA:message} 

对于第三个消息,我不知道应该用哪一种模式。

如果您添加更多详细信息,我会更新我的答案。

参考:grok pattern definitions

+0

对于第一消息,我使用十六进制编辑器,并已发现,??来自马克的字节。我该如何摆脱? –

+0

@KennedyKan也许http://stackoverflow.com/questions/1068650/using-awk-to-remove-the-byte-order-mark可以提供帮助。或者因为它只在第一行,你可以忽略它 – baudsp

+0

我已经查看了链接中的信息,但我不知道如何扫描我将这些想法合并到logstash中。有没有可以完成这项工作的logstash命令,或者logstash能够解析十六进制字符? –