You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中的日志配置即可:

  1. 首先在文件顶部引入socket模块:
import socket
  1. 调整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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 12:06:09