如何使用不同类型的消息解析日志文件

时间:2016-07-07 07:40:30

标签: logstash logstash-grok

我有一个包含复杂消息类型的日志文件。这是一个例子:

2016-07-07 13:30:02 [Main] *** Program start ***
2016-07-07 13:30:02 [UnzipFile] Before file collection
2016-07-07 13:30:02 [GetZipCol] Start get sorted zip file collection
2016-07-07 13:30:02 [GetZipCol] End get sorted zip file collection
2016-07-07 13:30:02 [Main] [ERROR] No unzip file
2016-07-07 13:30:03 [Main] *** Program end ***

以下grok模式仅适用于前4行但不适用于第5行。

grok{
    match => {"message" => ['%{Date:Date}%{SPACE}%{Time:Time}%{SPACE}%{WORD:Job}%{SPACE}%{GREEDYDATA:Message}']}
        }

我想知道如何修改grok模式以捕获上一条消息中的[ERROR]。有没有人知道如何做到这一点?

这是我在conf

中的输出部分
if [Message] == "*** Program start ***" {
    elasticsearch { 
    hosts => ["localhost:9200"] 
    index => "log-%{+YYYY.MM.dd}"
    template => "C:/logstash/log.json"
    template_overwrite => true
    }   
}
if [Message] == "*** Program end ***" {
    elasticsearch { 
    hosts => ["localhost:9200"] 
    index => "log-%{+YYYY.MM.dd}"
    template => "C:/logstash/log.json"
    template_overwrite => true
    }   
}  
if [Level] =~ /.+/ {
    elasticsearch { 
    hosts => ["localhost:9200"] 
    index => "log-%{+YYYY.MM.dd}"
    template => "C:/logstash/log.json"
    template_overwrite => true
    }   
}

如果我只想在程序开始和结束时掌握事件,并且在其他事件可以被删除时也有错误的事件。但是,根据我所写的内容。我只能用[错误]来掌握数据。我该如何掌握其他数据?并且有一种更简单的方法可以做到这一点而不是在条件语句中输入3吗?感谢。

感谢。

2 个答案:

答案 0 :(得分:1)

您可以在同一个grok过滤器中使用两个模式,如果第一个模式失败,则第二个模式使用。因此,在您的情况下,第一个模式将尝试捕获[ERROR],第二个模式将是您的答案中的模式。
我认为它更具可读性。

grok{
  match => {
    "message" => [
       '%{DATE:Date}%{SPACE}%{TIME:Time}%{SPACE}\[%{WORD:Job}\]%{SPACE}\[%{WORD:Level}\]%{SPACE}%{GREEDYDATA:Message}',
       '%{DATE:Date}%{SPACE}%{TIME:Time}%{SPACE}\[%{WORD:Job}\]%{SPACE}%{GREEDYDATA:Message}'
   ]}
}

答案 1 :(得分:0)

我不是logstash的专家,但是从文档的快速浏览看来,这些“grok”模式似乎是普通正则表达式之上的抽象。

因此,为ERROR级别消息添加可选的非捕获组可能会起作用。即(?:\[%{WORD:Level}\]%{SPACE})?。这样就可以读出整行:

grok{
    match => {"message" => ['%{Date:Date}%{SPACE}%{Time:Time}%{SPACE}%{WORD:Job}(?:\[%{WORD:Level}\]%{SPACE})?%{GREEDYDATA:Message}']}
}

作为参考,我使用了文档的这一部分:https://www.elastic.co/guide/en/logstash/current/config-examples.html#_processing_syslog_messages