我有一个安装了 rsyslog 的官方 Alpine 容器,我的/etc/rsyslog.conf
是:
$MaxMessageSize 64k
$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support
$KLogPermitNonKernelFacility on
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
*.*;auth,authpriv.none -/var/log/syslog
我使用 运行 rsyslog rsyslogd -f /etc/rsyslog.conf
,看来$MaxMessageSize
是 1k 而不是 64k 我哪里错了?
更新
我已经在 ubuntu 容器中尝试过并且运行正常,看来 alpine 是问题所在,在 ubuntu 中 rsyslog 是版本 7.4.4,在 alpine 中是 8.18.0
更新2
我也尝试过使用 syslog-ng,结果相同,最大大小为 1k,也许是 Alpine docker 容器的限制?
答案1
昨天我偶然发现了同样的问题,经过一番挖掘,我找到了原因。
我会简短地说:libc
Alpine 上使用的库是musl libc
(https://www.musl-libc.org/)如果你检查函数的实现syslog
(https://git.musl-libc.org/cgit/musl/tree/src/misc/syslog.c#n87buf
),您可以看到表示消息的变量的长度被硬编码为1024。
一个解决方案是自己连接并发送消息(实现 syslog RFC)到套接字/dev/log
。效果很好。
另一个可能是glibc
在 alpine lib 上使用,但我不知道是否真的可行。