ELK从多个dockerimage processing多行日志

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

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

然后我在Logstash中处理日志。 在这里,我想折叠多行消息,并将它们合并成一个事件(在我的例子中是Javaexception)。 我的configuration是:

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

当我处理来自一个docker集装箱的日志时,它完美的工作,但是对于两个或更多的它不起作用,因为它折叠了两个(或更多)日志stream的消息。

我希望,在input中设置多线可以解决问题

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

但multilining不能正确使用这个设置(似乎是因为bug )。 有什么build议么? 谢谢。

我正在使用:Docker 1.9.1,Logstash 2.1

我们通过使用多行筛选的选项'stream_identity'来解决它。

stream标识是多线filter如何确定一个事件属于哪个stream。 这通常用于区分来自同一文件input中来自多个文件的事件,或来自tcpinput的多个连接。

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

在使用Gelf时,可以使用host和container_id来唯一标识消息:

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