gpt4 book ai didi

docker - ELK处理来自多个docker镜像的多行日志

转载 作者:行者123 更新时间:2023-12-02 06:49:38 26 4
gpt4 key购买 nike

我正在运行 docker 容器的集群中运行 ELK(Elasticsearch、Logstash、Kibana)。这些容器通过 GELF 端点将日志发送到 Logstash。

docker run  --log-driver=gelf --log-opt gelf-address=udp://somehost:12201 -ti    my-app:latest 

然后我在 Logstash 中处理日志。在这里,我想折叠多行消息并将它们合并到单个事件中(在我的例子中是 Java 异常(exception))。我的配置是:

input {
gelf {}
}
filter{
multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => "previous"
source => "short_message"
}
}
output {
stdout { codec => rubydebug }
}

当我处理来自一个 Docker 容器的日志时,它工作得很好,但对于两个或多个容器,它不起作用,因为它会折叠两个(或多个)日志流的消息。

我希望在输入中设置多行可以解决问题

input {
gelf {
filter{
multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => "previous"
}
}
}

但是多线在这种设置下无法正常工作(似乎是因为 bug )。有什么建议么?谢谢。

我正在使用:Docker 1.9.1、Logstash 2.1

最佳答案

我们通过使用多行过滤的选项“stream_identity”解决了这个问题。

The stream identity is how the multiline filter determines which stream an event belongs to. This is generally used for differentiating, say, events coming from multiple files in the same file input, or multiple connections coming from a tcp input.

https://www.elastic.co/guide/en/logstash/current/plugins-filters-multiline.html#plugins-filters-multiline-stream_identity

当您使用 Gelf 时,您可以使用主机和 container_id 来唯一标识消息:

filter {

multiline {
pattern => "^%{TIMESTAMP_ISO8601}"
negate => true
what => "previous"
source => "short_message"
stream_identity => "%{host}.%{container_id}"
}
}

关于docker - ELK处理来自多个docker镜像的多行日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34075538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com