将docker日志获取到graylog2和本地

我一直在这个问题上工作了几天,没有find答案的运气。

设置是我有几个主机运行Docker容器组,我需要所有容器日志的本地副本,并在一个集中的graylog2服务器上。

graylog2服务器已启动并运行,并在端口9000上具有GELFinput,在514上具有系统日志UDPinput。

  1. 最初,容器正在login到Docker主机上的JSON文件。 然后,我改变了docker中的日志驱动程序使用GELF并发送到graylog2服务器。 这工作得很好,但事实certificate我们也需要本地的日志副本。 最好的部分是,graylog上的日志有很好的填充字段,包括“container_name”和“source”(这是docker主机的主机名)。

  2. 所以我恢复到使容器日志到JSON,然后只是将JSON日志发送到graylog2,但是当我这样做时,graylog2只显示一个包含源,container_name,container_id,但没有任何的相应字段。

  3. 然后,我试着将日志驱动更改为syslog,然后让rsyslog或syslog-ng将日志的副本发送给graylog2,但是在graylog2上创build的条目缺less一堆数据,这次消息只包含实际的消息,根本就没有关于container_name或container_id的信息。

  4. 然后,我尝试将日志驱动程序更改回GELF,并使syslog-ng在每个docker主机上侦听,docker正在将日志发送到正在坐的主机。 这和上面的解决scheme#2有相似的结果,所以我看到一个非常长的包含host,container_name,container_id,timestamp等的“message”字段,但是graylog2似乎并不想填充相应的字段。 此外,在这种方法中,所有日志都将日志源设置为docker主机的IP地址,即使我使用的是主机名。

  5. 我试着安装graylog-collector-sidecar,但是这似乎并没有工作。

有没有人有从哪里去的build议? 我想选项#3会好,如果我能以某种方式包括至lesscontainer_name显示(也许有一个标签)。 另一个我认为是好的解决scheme是,如果我能得到#4实际上填充字段,意思而不是这样:

source: $IP message: $IP {"version","1.1","host":"$HOSTNAME","message":"$MESSAGE","container_name":"$CONTAINER_NAME","container_id":"$CONTAINER_ID",etc etc} 

它应该显示这个:

 source: $HOSTNAME container_name: $CONTAINER_NAME container_id: $CONTAINER_ID message: $MESSAGE 

任何人都知道我可以如何让graylog2(或syslog-ng)来格式化日志数据,使其看起来像下面的例子? 请注意,当我使用GELF日志驱动程序将日志数据直接从docker发送到graylog2时,数据确实以该格式显示,而且非常棒,我们只需要在本地保留一份日志的副本。

预先感谢您的任何意见! -Martin

Interesting Posts