将docker容器日志发送到logstash的最佳方法

比方说,我有一个容器(泊坞窗)内运行的Nginx。
访问日志和错误日志通过STDOUT在Dockerfile中发送:

# forward request and error logs to docker log collector RUN ln -sf /dev/stdout /var/log/nginx/access.log RUN ln -sf /dev/stderr /var/log/nginx/error.log 

Logspout似乎是一个优雅的解决scheme,可以在logstash内发送容器的STDOUT(configuration了sysloginput)

 input { syslog { type => syslog port => 5514 } } 

但是logspout不知道通过STDOUT发送的日志的格式(或者我错过了什么?)

所以我必须做一些事情:

 input { syslog { type => nginx-access port => 5514 } } 

但那么nginx错误日志呢? 如果我也通过STDOUT发送php-fpm日志呢? logspout如何pipe理这个?

另一个解决scheme是运行rsyslog indos容器并将收集的日志发送到logstatsh的input…

正如你所看到的,这对我来说并不是很清楚……我希望能够发送nginx和php-fpm日志到logstash,以便它们可以被解释为它们是什么……但是我没有find“好的做法“…

你能帮我吗

现在,你可以用一些意大利式的pipe道来做到这一点。

在较新版本的Docker中,有一个GELF输出驱动程序 ,您可以其configuration为发送日志。 由于logstash具有GELFinput插件 ,因此可以将logstashconfiguration为接收这些相同的日志消息,并对其执行一些有用的操作。

另一种select是,如果您希望避免GELF翻译往返,则使用logspout-logstash ,一个logspash输出插件,用于读取从Docker中出来的日志条目。

我只注意到最近版本的nginx可以configuration为login到networkingsyslog守护进程。

从版本1.7.1开始,可以logging到syslog。

使用此function,您可以在logstash中的专用UDP端口上configuration系统日志inputfilter,并且您将进入比赛。

不幸的是,v1.7.1在官方回购中还有很长一段路要走。 你需要一个日志托运的地方

  1. 在nginx容器中。
  2. 在使用'–volumes-from'来访问nginx容器的并行容器中。
  3. 在具有绑定到主机文件系统的卷的docker主机上。

你有许多日志托运人可以从中select一本关于该主题的Logstash Book的免费章节 。