将docker日志记录到graylog2和本地

时间:2017-03-03 18:30:10

标签: docker graylog2 syslog-ng

我已经在这个问题上工作了几天,并且没有找到答案。

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

graylog2服务器已启动并正在运行,并且在端口9000上具有GELF输入,在514上具有syslog UDP。

  1. 最初,容器正在登录到docker主机上的JSON文件。然后我更改了docker中的日志驱动程序以使用GELF并发送到graylog2服务器。这工作正常,但事实证明我们也需要本地的日志副本。关于这一点最好的部分是graylog上的日志填写了很好的字段,包括" container_name"和"来源" (这是docker主机的主机名)。

  2. 所以我恢复了将容器记录到JSON然后只是将JSON日志发送到graylog2,但是当我这样做时,graylog2只显示了一个包含source,container_name,container_id和message的消息的长字符串。等等,但不在任何相应的字段中。

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

  4. 然后我尝试将日志驱动程序更改回GELF并让syslog-ng监听每个docker主机并且docker正在将日志发送到它所在的主机。这与上面的解决方案#2有类似的结果,所以我看到了很长的消息"包含host,container_name,container_id,timestamp等的字段,但graylog2似乎不想填充相应的字段。此外,在此方法中,所有日志都将日志源设置为docker主机的IP地址,即使我为所有内容使用主机名。

  5. 我尝试安装graylog-collector-sidecar,但这似乎根本不起作用。

  6. 有没有人对从哪里开始有任何建议?如果我能以某种方式包含至少要显示的container_name(可能带有标签),我认为选项#3会很好。我认为另一种解决方案是好的,如果我能够#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

1 个答案:

答案 0 :(得分:0)

看起来Docker Enterprise允许您使用双重日志记录,请参见https://docs.docker.com/config/containers/logging/configure/#limitations-of-logging-drivers

另一种选择是使用fluentd将日志发送到Graylog(而不是使用Docker的日志记录驱动程序),请参见https://jsblog.insiderattack.net/bunyan-json-logs-with-fluentd-and-graylog-187a23b49540