如何让 syslog 在 docker 中可用?

How to let syslog workable in docker?

我的应用程序将发送系统日志 local0 消息。 当我将我的应用程序移动到 docker 时,我发现很难显示系统日志。

我试过 运行 docker as --log-dirver 作为 syslog 或 journald,两者都工作得很奇怪,/var/log/local0.log 显示 [=20 的控制台输出=] 容器而不是我的应用程序的系统日志,当我尝试 运行 容器内的这个命令时

logger -p local0.info -t a message

因此,我尝试在 docker 容器中安装 syslog-ng。 外面的 docker 框是 Arch Linux (内核 4.14.8 + systemctl)。 docker 容器作为 CentOS 6 运行ning。如果我在容器内安装 syslog-ng 并启动它,它会显示以下消息。

# yum install -y syslog-ng  # this will install syslog-ng 3.2.5
# /etc/init.d/syslog-ng start
Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql'
Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql'
Error opening file for reading; filename='/proc/kmsg', error='Operation not permitted (1)'
Error initializing source driver; source='s_sys', id='s_sys#0'
Error initializing message pipeline;

CentOS 6:

1.

Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql' 
Starting syslog-ng: Plugin module not found in 'module-path'; module-path='/lib64/syslog-ng', module='afsql'

您可以通过安装 syslog-ng-libdbi 软件包来修复上述错误:

yum install -y syslog-ng-libdbi

2.

Error opening file for reading; filename='/proc/kmsg', error='Operation not permitted (1)'
Error initializing source driver; source='s_sys', id='s_sys#0'
Error initializing message pipeline;

由于 syslog-ng 无法直接访问内核消息,您需要在其配置中禁用(注释):

sed -i 's|file ("/proc/kmsg"|#file ("/proc/kmsg"|g' /etc/syslog-ng/syslog-ng.conf

CentOS 7:

1.

Error opening file for reading; filename='/proc/kmsg', error='Operation not permitted (1)'

system() 源处于默认配置。此源自动读取特定于平台的源,如果内核是 3.5 或更高版本,则在 Linux 上读取 /dev/kmsg。因此,我们需要在配置文件中禁用(注释)system()源:

sed -i 's/system()/# system()/g' /etc/syslog-ng/syslog-ng.conf

2. 当我们以前台模式启动它时 syslog-ng -F 我们得到以下信息:

# syslog-ng -F
syslog-ng: Error setting capabilities, capability management disabled; error='Operation not permitted'

所以,我们需要 运行 syslog-ng 作为 root,没有能力支持:

syslog-ng --no-caps -F

另一种方法是使用 syslog/rsyslog 服务器设置中央日志记录,然后使用 syslog docker 驱动程序进行日志记录。在 docker 运行 命令行上使用的语法是:

$ docker run --log-driver=syslog \
--log-opt syslog-address=udp://address:port image-name

目标 syslog 服务器协议可以是 udp 或 tcp,服务器地址可以是远程服务器、VM、不同的容器或本地容器地址。

image-name 替换为您的应用 docker 图片名称。

准备好的 rsyslog docker 映像可在 https://github.com/jumanjihouse/docker-rsyslog

上使用

参考文献:Docker 在 docker.com、

登录

Docker 命令行界面,https://www.aquasec.com/wiki/display/containers/Docker+Containers+vs.+Virtual+Machines

在我的应用程序被 docker 化后,我在从我的应用程序获取标准 "syslog" 输出时也遇到了问题。

我从不同的方向解决了这个问题。我想在主机 /var/log/syslog

上获取容器系统日志

我有 运行 我的容器,带有额外的 /dev/log 设备,瞧,它工作得很好。

docker run -v /dev/log:/dev/log  sysloggingapp:latest

对于任何试图在未来解决这个问题的人,

我发现的最好方法是在 openlog() 中设置 LOG_PERROR 标志。 这样,您的 syslog 将打印到 stderr,然后 docker 将默认记录(为此您不需要 docker 中的 运行 syslog 进程)。这比尝试弄清楚如何在 docker 容器中 运行 一个系统日志进程以及你的应用程序要容易得多(docker 可能并不是为了这样做而设计的)。