Rsyslog转发Docker日志到Splunk时2K以上大消息被丢弃问题求助
解决方案1:修复 Rsyslog $MaxMessageSize 不生效问题
Rsyslog 8.x 版本中全局消息大小限制参数必须配置在输入模块加载之前,放在模块加载后的配置会直接失效,这是该参数不生效的最常见原因。同时注意单位大小写敏感,必须使用小写k表示千字节。
正确配置示例(写入rsyslog.conf最顶部):
# 第一步:先配置最大消息大小,64k对应65536字节 $MaxMessageSize 64k # 第二步:再加载输入模块 module(load="imuxsock") # 本地syslog unix套接字模块 module(load="imudp") input(type="imudp" port="514") module(load="imtcp") input(type="imtcp" port="514") # 后续的转发规则、过滤规则写在模块配置下方
配置完成后执行以下命令验证:
- 检查配置语法:
rsyslogd -N 1 - 重启服务生效:
systemctl restart rsyslog - 测试大消息投递:
logger -s -t test_msg $(head -c 3K /dev/urandom | base64),检查Splunk是否能收到该条测试日志。
解决方案2:Django 直接通过TCP套接字写入日志到Rsyslog
UDP协议本身存在单包最大长度限制,切换为TCP协议投递日志可以从根源避免大消息被截断丢弃,直接修改Django的settings.py中的日志配置即可:
- 首先在文件顶部引入socket模块:
import socket
- 调整LOGGING配置,指定SysLogHandler使用TCP协议:
LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'syslog_tcp': { 'class': 'logging.handlers.SysLogHandler', 'address': ('你的Rsyslog服务IP', 514), # 容器内部署时填宿主机可访问IP,不要填127.0.0.1 'socktype': socket.SOCK_STREAM, # 指定TCP协议,替换默认UDP 'facility': 'local7', }, }, 'loggers': { 'django': { 'handlers': ['syslog_tcp'], 'level': 'INFO', 'propagate': True, }, # 其他自定义应用日志也指定该handler即可 } }
注意需要提前在Rsyslog配置中开启TCP 514端口的监听。
补充排查点(Docker层限制)
如果你的日志是通过Docker官方syslog驱动转发到宿主机Rsyslog,还需要修改/etc/docker/daemon.json避免Docker层截断大日志:
{ "log-driver": "syslog", "log-opts": { "syslog-address": "tcp://127.0.0.1:514", "max-size": "64k" } }
修改后执行systemctl restart docker重启服务生效。
内容的提问来源于stack exchange,提问作者Stephen Dimig
相关产品推荐
相关产品推荐

