Logstash 聚合日志存储筛选器配置

Logstash 聚合日志存储筛选器配置,logstash,Logstash,我的目标是在logstash中结合基于pId的事件。但我发现,具有相同pId的事件并没有合并到一个事件中。添加聚合后,我看不到任何更改。请帮助 日志如下所示: June 1st 2017, 11:51:26.992 {id} {pId} ClassName:methodName:99 [DEBUG] - Received request: June 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - Id: a

我的目标是在logstash中结合基于pId的事件。但我发现,具有相同pId的事件并没有合并到一个事件中。添加聚合后,我看不到任何更改。请帮助

日志如下所示:

June 1st 2017, 11:51:26.992 {id} {pId} ClassName:methodName:99 [DEBUG] - Received request:
June 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - Id: abbababcajdfbjasndflsdlf
June 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - unique id: AAAAA
June 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] Total time: 12
这是我的配置:

filter {
grok{
match => { "message" => "%{DATESTAMP:log_timestamp} %{DATA:id} %{DATA:pId} %{DATA:ClassName} [%{LOGLEVEL:severity}] - %{GREEDYDATA:message}" }
}
if [message] =~ /Received request:/ {
aggregate {
task_id => "%{pId}"
code => "map['message'] = event['message']"
map_action => "create"
}
}
else if [message] =~ /Total time:^/ {
aggregate {
task_id => "%{pId}"
code => "map['new_message'] = event['message'];event['new_message'] = map['new_message']"
map_action => "update"
end_of_task => true
timeout => 120
}
}
else {
aggregate {
task_id => "%{pId}"
code => "map['new_message'] = event['message'];event['new_message'] = map['new_message']"
map_action => "update"
}
}
}

聚合是一种很难正确使用的过滤器。在很大程度上,因为Logstash是从bolts out设计成并行处理管道的,所以过滤器堆栈中的每个
aggregate
调用对于管道来说都是唯一的,并且您无法确保所有事件都将通过同一管道运行。就是说,开箱即用

如果使用
-w1
参数运行logstash以强制所有内容通过单个管道,您将获得此行为

在这种情况下,我建议改用
输入
上的
多行
编解码器。这会将所有日志线集中在一个事件中,您可以稍后在过滤器阶段中解析该事件。当然,这假设这些多行事件中的每一个都是同时插入的,并且永远不会多路复用。如果得到多路复用,那么聚合将需要失去并行性

input {
  file {
    path => "/var/log/app/debug_logs.log"
    codec => multiline {
       pattern => "Received request:"
       negate => true
       what => previous
    }
  }
}
这将搜索与您的
接收请求不匹配的事件:
regex,并将它们附加到前一行。当它确实看到
收到的请求:
时,它将启动一个新事件。然后,您的
过滤器{}
阶段将看到

message => "June 1st 2017, 11:51:26.992 {id} {pId} ClassName:methodName:99 [DEBUG] - Received request:\nJune 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - Id: abbababcajdfbjasndflsdlf\nJune 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - unique id: AAAAA\nJune 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] Total time: 12"

在并行上下文中更容易操作。

聚合是很难正确使用的过滤器之一。在很大程度上,因为Logstash是从bolts out设计成并行处理管道的,所以过滤器堆栈中的每个
aggregate
调用对于管道来说都是唯一的,并且您无法确保所有事件都将通过同一管道运行。就是说,开箱即用

如果使用
-w1
参数运行logstash以强制所有内容通过单个管道,您将获得此行为

在这种情况下,我建议改用
输入
上的
多行
编解码器。这会将所有日志线集中在一个事件中,您可以稍后在过滤器阶段中解析该事件。当然,这假设这些多行事件中的每一个都是同时插入的,并且永远不会多路复用。如果得到多路复用,那么聚合将需要失去并行性

input {
  file {
    path => "/var/log/app/debug_logs.log"
    codec => multiline {
       pattern => "Received request:"
       negate => true
       what => previous
    }
  }
}
这将搜索与您的
接收请求不匹配的事件:
regex,并将它们附加到前一行。当它确实看到
收到的请求:
时,它将启动一个新事件。然后,您的
过滤器{}
阶段将看到

message => "June 1st 2017, 11:51:26.992 {id} {pId} ClassName:methodName:99 [DEBUG] - Received request:\nJune 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - Id: abbababcajdfbjasndflsdlf\nJune 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] - unique id: AAAAA\nJune 1st 2017, 11:51:26.993 {id} {pId} ClassName:methodName:100 [DEBUG] Total time: 12"

在并行上下文中更容易操作。

一个示例配置或文档可以帮助您指导如何使用多行操作。我看不到5.4中的流标识设置可用。@user3141789提供了一个示例。谢谢您的示例,但这里有一个问题。在这里,pId将变得杂乱无章。我只想用相同的pId组合事件。使用上述多行配置,所有PID都将合并。@user3141789如果日志行同时到达,这应该不会有问题。如果它们与其他PID条目交叉出现,则多行不是您的解决方案。提供一个示例配置或文档,指导如何使用多行来实现这一点,可能会有所帮助。我看不到5.4中的流标识设置可用。@user3141789提供了一个示例。谢谢您的示例,但这里有一个问题。在这里,pId将变得杂乱无章。我只想用相同的pId组合事件。使用上述多行配置,所有PID都将合并。@user3141789如果日志行同时到达,这应该不会有问题。如果它们与其他PID条目交叉到达,则多行不是您的解决方案。