如何让 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 可能并不是为了这样做而设计的)。
我的应用程序将发送系统日志 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 可能并不是为了这样做而设计的)。