2

我在玩 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 解析它。

我认为我一直在犯一个非常愚蠢的错误,或者我错误地理解了要实施的过滤器。任何帮助将非常感激!

4

1 回答 1

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}
}
于 2014-09-10T01:15:51.820 回答