【问题标题】:How to parse log file with different types of messages如何解析具有不同类型消息的日志文件
【发布时间】:2018-04-27 22:50:04
【问题描述】:

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

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 if 条件语句?谢谢。

谢谢。

【问题讨论】:

  • "我只能用 [Error] 掌握数据" 不是这样,最后一个条件语句意味着你掌握了模式成功解析的所有消息字段Level
  • 不是做三个条件,你可以做一个,否定三个不同的条件并丢弃所有通过 => if ([Message] != "*** Program start ***" and [Message] != "*** Program end ***" and [Level] !~ /.+/) { drop{} } 的消息。然后你使用一个 elasticsearch 输出
  • @baudsp 谢谢,它运作良好。只想知道如何检查消息是否包含“程序”一词而不是整行消息?
  • 就像你对[Level]所做的一样,你可以像这样使用=~比较器:=~ /Program/

标签: logstash logstash-grok


【解决方案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}'
   ]}
}

【讨论】:

  • 我已经设法按照您的链接进行一些过滤,但是,我无法获得预期的结果。我已经编辑了我的问题,以便清楚我的问题。谢谢,如果有任何帮助。
  • @KennedyKan 预期的结果是什么?
  • 我已经通过将您的 cmets 参考我的问题解决了这个问题。非常感谢
  • 两个正则表达式之间是否缺少逗号 ',',例如 'regex1',\n'regex2'
  • @user84592 很好。谢谢。
【解决方案2】:

我不是 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

【讨论】:

  • 感谢您的回答。只想知道如何删除任何不包含错误的事件?谢谢。
  • 我已经设法按照您的链接进行一些过滤,但是,我无法获得预期的结果。我已经编辑了我的问题,以便清楚我的问题。谢谢,如果有任何帮助。
猜你喜欢
  • 2012-06-03
  • 2012-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多