如何使用多个工作线程处理 logstash 中的多行?
How to process multilines in logstash with multiple worker threads?
我想使用多个工作线程使用 logstash 处理多行日志以提高性能,但多行过滤器不起作用:
- https://github.com/elastic/logstash/pull/1591
- https://github.com/elastic/logstash/issues/1590
目前的解决方案:
- 使用多个 logstash-forwarder 并将它们发送到不同的 lumberjack 端口(扩展性非常差:每个具有多行的日志文件的新 logstash-forwarder)
- 使用带有 redis 输出的额外 logstash-receiver 和从 redis 读取并使用一个工作线程的额外 logstash 索引器
(https://groups.google.com/forum/#!msg/logstash-users/fUhulxmZ0Ek/HfGev7BOhCUJ)
- 作为 hack,我尝试在带有 lumberjack 输出的 logstash 输出部分中进行多行类型检查,并将它们重新发送到同一个 logstash 实例的不同 lumberjack 输入(不同端口),该输入具有编解码器多行但它没有'不处理它们
- 我也可以使用读取事件的 rabbitMQ,但我应该在它们发送到 rabbitMQ 之前合并多行(我应该怎么做?)
- rsyslog 也可以发送日志,但它需要特殊格式的多行日志并且不能使用正则表达式(https://serverfault.com/questions/622035/how-do-i-configure-rsyslog-to-deal-with-mysql-slow-query-log-multi-line-messages)
显然 none 这些都很好,那么有没有人对此有合适的解决方案?
我最终使用了单独的 logstash 来处理多行。它被配置为使用一个工作线程并使用多行过滤器。如果性能仍然不佳,您可以添加更多仅使用一个工作线程的 logstash。然后当有人修复它时,我们将删除这个额外的 logstash 实例。
另一种方法是使用 log-courier 而不是 logstash-forwarder。它在将其发送到 logstash 之前执行多行:
https://github.com/driskell/log-courier/blob/master/docs/codecs/Multiline.md
在 logstash-forwarder 中也有支持此功能的请求:
https://github.com/elastic/logstash-forwarder/issues/309
我很好奇,您是如何将多行日志发送到特定的单线程 logstash 而将其余日志发送给其他人的?
还有一个选择:
使用 multiline
编解码器直接在输入中进行多行处理。显然这个位将是每个输入的单线程。
然后正常使用其余过滤器。如果提供了 -w <threads>
,这将是多线程的,每个过滤器工作者。
Logstash Pipeline's Thread Model记录如下:
The thread model in Logstash is currently:
input threads | filter worker threads | output worker
尝试类似的东西,
multiline {
pattern => "(Stack trace:)|(^#.+)|(^\"\")|( thrown+)|(^\s)"
what => "previous"
}
我将它用于 Php 致命错误。
我想使用多个工作线程使用 logstash 处理多行日志以提高性能,但多行过滤器不起作用: - https://github.com/elastic/logstash/pull/1591 - https://github.com/elastic/logstash/issues/1590
目前的解决方案:
- 使用多个 logstash-forwarder 并将它们发送到不同的 lumberjack 端口(扩展性非常差:每个具有多行的日志文件的新 logstash-forwarder)
- 使用带有 redis 输出的额外 logstash-receiver 和从 redis 读取并使用一个工作线程的额外 logstash 索引器 (https://groups.google.com/forum/#!msg/logstash-users/fUhulxmZ0Ek/HfGev7BOhCUJ)
- 作为 hack,我尝试在带有 lumberjack 输出的 logstash 输出部分中进行多行类型检查,并将它们重新发送到同一个 logstash 实例的不同 lumberjack 输入(不同端口),该输入具有编解码器多行但它没有'不处理它们
- 我也可以使用读取事件的 rabbitMQ,但我应该在它们发送到 rabbitMQ 之前合并多行(我应该怎么做?)
- rsyslog 也可以发送日志,但它需要特殊格式的多行日志并且不能使用正则表达式(https://serverfault.com/questions/622035/how-do-i-configure-rsyslog-to-deal-with-mysql-slow-query-log-multi-line-messages)
显然 none 这些都很好,那么有没有人对此有合适的解决方案?
我最终使用了单独的 logstash 来处理多行。它被配置为使用一个工作线程并使用多行过滤器。如果性能仍然不佳,您可以添加更多仅使用一个工作线程的 logstash。然后当有人修复它时,我们将删除这个额外的 logstash 实例。
另一种方法是使用 log-courier 而不是 logstash-forwarder。它在将其发送到 logstash 之前执行多行:
https://github.com/driskell/log-courier/blob/master/docs/codecs/Multiline.md
在 logstash-forwarder 中也有支持此功能的请求:
https://github.com/elastic/logstash-forwarder/issues/309
我很好奇,您是如何将多行日志发送到特定的单线程 logstash 而将其余日志发送给其他人的?
还有一个选择:
使用
multiline
编解码器直接在输入中进行多行处理。显然这个位将是每个输入的单线程。然后正常使用其余过滤器。如果提供了
-w <threads>
,这将是多线程的,每个过滤器工作者。
Logstash Pipeline's Thread Model记录如下:
The thread model in Logstash is currently:
input threads | filter worker threads | output worker
尝试类似的东西,
multiline {
pattern => "(Stack trace:)|(^#.+)|(^\"\")|( thrown+)|(^\s)"
what => "previous"
}
我将它用于 Php 致命错误。