Docker rsyslog 驱动程序在实际消息之前添加消息长度

vit*_*ini 5 logging rsyslog docker

我正在尝试配置 rsyslog 服务器以从 docker 容器接收日志。我目前正在使用以下命令来运行 docker 容器:

sudo docker run -d --log-driver=syslog --log-opt syslog-address=udp://localhost:514 --log-opt syslog-format=rfc5424 --log-opt tag="remote:shouldshow" alpine echo "some random message"
Run Code Online (Sandbox Code Playgroud)

我使用 rfc5424 是因为从 docker 到 rsyslog 的标准日志格式会在冒号字符处中断消息,分割标签 remote:shouldshow 并将 shouldshow 添加到消息中。有关此情况的更多信息:https ://github.com/docker/docker/issues/18712

问题是来自 docker 的日志消息在消息前有一个额外的三位数,如以下示例中的 127(来自 rsyslog 的 rawmsg 属性):

127 <30>1 2016-07-12T00:51:13-03:00 vitor-Lenovo-G50-70 docker/remote:shouldshow 2910 docker/remote:shouldshow some random message
Run Code Online (Sandbox Code Playgroud)

当我尝试使用 APP-NAME 或 syslogtag 等 syslog 属性时,它们的值都是 <30>1。

我复制了这条不带 127 的消息,并通过 netcat 将其发送到 syslog 服务器,并且这些值已正确解析,如下所示:

echo '<30>1 2016-07-12T00:15:53-03:00 vitor-Lenovo-G50-70 docker/remote:shouldshow 2910 docker/remote:shouldshow some random message' | nc -u -v localhost 514
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么会发生这种情况?任何帮助将非常感激。提前致谢。

查看docker代码我发现这个三位数是消息的长度。我仍然面临同样的问题,rsyslog 无法正确解析此消息,包括实际日志消息之前的长度。

vit*_*ini 5

经过一番努力我已经想通了。事实证明,如果您将 Docker 日志驱动程序配置为使用 RFC5424 syslog 格式,Docker 将使用一个使用 RFC5425 标准发送 syslog 消息的库,该标准定义了通过 TLS 发送 syslog 消息的标准方式。https://www.rfc-editor.org/rfc/rfc5425

因此,如果您将 Docker 日志驱动程序配置为使用 TLS,并将 rsyslog 服务器配置为接收加密消息,则 rsyslog 会正确解析该消息。