【发布时间】:2017-07-23 23:42:04
【问题描述】:
我已经解决这个问题几天了,但没有找到答案。
设置是我有几个运行 docker 容器组的主机,我需要在一个集中的 graylog2 服务器上拥有所有容器日志的本地副本。
graylog2 服务器已启动并运行,并在端口 9000 上为 GELF 输入,在 514 上为 syslog UDP 输入。
最初,容器记录到 docker 主机上的 JSON 文件。然后我将 docker 中的日志驱动程序更改为使用 GELF 并发送到 graylog2 服务器。这工作得很好,但事实证明我们也需要日志的本地副本。最好的部分是 graylog 上的日志很好地填写了字段,包括“container_name”和“source”(这是 docker 主机的主机名)之类的内容。
1234563依此类推,但不在任何相应的字段中。
然后我尝试将日志驱动程序更改为 syslog 并让 rsyslog 或 syslog-ng 将日志的副本发送到 graylog2,但是在 graylog2 上创建的条目丢失了一堆数据,这次只有消息包含实际消息,根本没有关于 container_name 或 container_id 的信息。
然后我尝试将日志驱动程序改回 GELF 并让 syslog-ng 监听每个 docker 主机,并且 docker 将日志发送到它所在的主机。这与上面的解决方案#2 具有相似的结果,因此我看到一个非常长的“消息”字段,其中包含主机、容器名称、容器 ID、时间戳等,但 graylog2 似乎不想填充相应的字段。此外,在这种方法中,所有日志都将日志源设置为 docker 主机的 IP 地址,即使我对所有内容都使用主机名。
我尝试安装 graylog-collector-sidecar,但似乎根本不起作用。
有人对从这里去哪里有任何建议吗?如果我能以某种方式至少包含要显示的 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 时,数据确实以该格式显示,这很棒,我们只需要在本地保留一份日志副本。
提前感谢您的任何意见! -马丁
【问题讨论】:
-
为什么容器中也需要它们?
-
嗨@R0MANARMY,这很复杂。简短版本是有一些遗留脚本可以解析需要继续工作的本地日志,尽管我确实可以选择更改它们读取的位置(json vs syslog),尽管如果容器名称保留在本地日志中会很好。
-
你试过 gliderlabs/logspout 了吗?我使用命令“syslog://HOSTNAME:514”。 Logspout 可以收集主机上所有运行的 docker 容器的日志,并通过 syslog-protocoll 发送到 graylog。