我的日志文件如下所示:
Node Name: StackOverflow
Node IP: 127.0.0.1
Logs: the name of my log
Logs Date: From 2016-06-12 To 2016-06-14
...
...
我试图通过在我的conf中执行此操作,在一个过滤器中加入所有这些行:
input {
file {
path => '[...]'
start_position => beginning
ignore_older => 0
codec => multiline {
pattern => "Log|Node"
negate => "false"
what => "previous"
}
}
}
output {
stdout { codec => rubydebug }
}
这样做时,我只是收到消息“{:timestamp =>”2016-06-29T12:51:28.876000-0700“,:message =>”Pipeline main started“}”并且没有打印任何内容。如果我将模式更改为“Log”或“Node”,我会得到一些结果,但显然不完全是我想要的。这似乎很基本,但我被卡住了。我缺少什么?
答案 0 :(得分:0)
这就是因为该模式与所有行匹配,所以它试图将它们全部连接到与模式不匹配的前一行,而这些模式并不存在。多行编解码器不应与您的所有行匹配,它应该仅匹配多行日志的分隔线(开始或结束行)或不是分隔符的每一行。如果你匹配所有内容,它就会把你所有的行加入到一个大事件中。
如果您的所有日志都以Node Name
开头,则可以将模式更改为
pattern => "^Node Name"
^
匹配一行开头,确保中间带有Node Name字样的日志不会破坏此行。
并设置
negate => "true"
将加入所有不以"节点名称"开头的行。到他们上面的那条线。以"节点名称"开头的行将匹配正则表达式,因此不会连接到它们上面的行,分隔单独的事件。
参考: https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html
答案 1 :(得分:0)
如果我已正确理解您的问题,您只想将以Node IP:
,Logs:
和Logs Date:
开头的行加入以Node Name:
开头的行。
您可以使用此多行:
multiline {
pattern => "(Node IP:)|(Logs:)|(Logs Date:)"
negate => "false"
what => "previous"
}
它与Node Name:
的第一行不匹配,但另一行将是。