带有logstash的多行过滤器未按预期工作

时间:2014-09-09 22:36:59

标签: multiline logstash logstash-grok

我正在玩logstash并想尝试多线过滤器。我正在尝试解析一个可以包含多行内容的文件。我正在使用多行过滤器,但它不能按预期方式工作。我在文件中有以下内容。

2014-10-11 10:10:10 xxxx yyyy
2013-09-12 11:11:11 aaaa bbbb
2012-01-01 10:10:10 cccc dddd
2011-10-12 01:01:01 mmmm Nan

使用Grok模式

CUSTOMTIME %{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}

我在logstash中使用以下配置文件

input {
    file{
        path => "/Users/akshayanilkapoor/Kumo/logs/akshay"
        codec => multiline {
            pattern => "^.*"
            what => "previous"
            negate => true
        }
    }
   stdin{
        codec => multiline {
            pattern => "^%{CUSTOMTIME}"
            what => "previous"
            negate => true
        }
     }
}
filter {
   grok {
        patterns_dir => "./patterns"
        match => ["message", "%{CUSTOMTIME:date1} %{GREEDYDATA:lumber-type} %{GREEDYDATA:lumber-desc}"]
        }
    }

output {
    stdout {codec => rubydebug}
}

当我从 stdin 复制粘贴上面显示的数据时,它按预期工作,即它显示输出,并带有包含文件中所有事件的消息。当我传递相同的文件时,它会为每个日志条目输出不同的消息,即我得到4个不同的日志事件(这不是我想要的)

注意:我尝试使用以下选项以及多线,

  1. (?m)grok中的多行模式,也没有任何帮助。
  2. 还使用mutate过滤器将“\ n”替换为“”并用grok解析它。
  3. 我认为我犯了一个非常愚蠢的错误,或者我正在理解过滤器的错误实施。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我误解了多行编解码器的否定选项,正如我预期的那样:p这是我用来配置工作的配置文件,它可以帮助某人。

input {
    file{
        path => "/Users/akshayanilkapoor/Kumo/logs/akshay"
        codec => multiline {
            pattern => "^[0-9]"
            what => "previous"
            #negate => true
        }
    }
   stdin{
        codec => multiline {
            pattern => "^[a-z]"
            what => "previous"
            negate => "true"
        }
     }
}

filter {
    grok {
        match => ["message", "(?m)%{RSMROLLBACKTIME:date1} %{GREEDYDATA:lumber-type} %{GREEDYDATA:lumber-desc}"]
    }
}

output {
    stdout {codec => rubydebug}
}