【问题标题】:Logstash Grok Parsing IssueLogstash Grok 解析问题
【发布时间】:2016-07-08 03:05:58
【问题描述】:

我正在使用 Logstash 读取一些日志文件。 以下是一些数据源记录

<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

这是我的配置文件

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 语句,以便它可以完全解析消息?

【问题讨论】:

    标签: elasticsearch logstash logstash-grok


    【解决方案1】:

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

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

    对于第二条消息,如果您希望使用第一个模式 (&lt;%{TIMESTAMP_ISO8601:Timestamp}&gt; (%{WORD:Level} - )%{NOTSPACE:Job_Code} =&gt; %{GREEDYDATA:message}) 对其进行解析,则您的模式为 false:

    • () 周围没有出现在日志中的 %{WORD:Level} -。
    • :Timestamp}&gt; 和 %{WORD:Level} 之间缺少一个空格。在日志中,模式中有两个且只有一个。请注意,您可以使用%{SPACE} 来避免这个问题(因为%{SPACE} 将匹配任意数量的空格)
    • %{NOTSPACE:Job_Code} 匹配一个不带空格的字符序列,但Export_Sysem 6 (1) 中有一个空格,所以Job_Code 将是Export_Sysem,而模式中的=&gt; 将阻止成功匹配第一个模式。

    正确的模式:

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

    对于第三条消息,我看不出应该使用哪种模式。

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

    供参考:grok pattern definitions

    【讨论】:

    • 对于第一条消息,我使用 Hex Editor 并发现 ??来自 Byte of Mark。我应该如何摆脱它?
    • @KennedyKan 也许stackoverflow.com/questions/1068650/… 可以提供帮助。或者因为它只在第一行,你可以忽略它
    • 我浏览了链接中的信息,但我不知道如何将这些想法合并到logstash中。是否有一个 logstash 命令可以完成这项工作,或者 logstash 是否能够解析 Hex char?
    • @KennedyKan 我更多地考虑手动修改文件以使问题消失。但是,如果您有多个文件,或者如果它们被轮换,则可能会很麻烦。
    猜你喜欢
    • 2021-03-31
    • 1970-01-01
    • 2015-12-18
    • 2017-07-18
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多