syslog-ng 3.5.6处理防火墙日志时输出被截断求助
从你的描述来看,核心问题是防火墙发送的syslog日志在tcpdump中显示完整,但经过syslog-ng 3.5.6处理后日志内容被截断,仅保留了头部信息。结合你的配置和日志格式,我判断最可能的原因是日志格式解析不匹配,以下是具体分析和解决步骤:
可能的原因
你提到tcpdump中的日志格式片段如下:
Msg: 1 2019-11-08T19:30:08 192.168.1.1 CP-GW - Log [Fields@1.3.6.1.4.1.2620 ...]
这是标准的RFC5424(IETF syslog)格式,包含版本号、ISO时间戳、主机名、应用名等规范字段;但syslog-ng 3.5.x默认采用旧版RFC3164(BSD syslog)格式的解析规则,这种规则无法正确识别RFC5424的结构,导致它无法提取出日志的核心内容(MESSAGE字段),最终输出时只显示了解析出来的头部,内容部分为空。
另外,你的全局配置中已经设置了log-msg-size(1048576),这个参数是足够的;虽然UDP源若未单独指定max-msg-size,旧版本默认值可能偏小,但你的日志仅694字节,这个因素可能性极低,优先排查解析匹配问题。
解决方案
1. 修改UDP源配置,启用RFC5424解析
找到你syslog-ng配置中s_udp514的定义,添加flags(syslog-protocol)参数(该参数会让syslog-ng按照RFC5424格式解析日志),同时显式设置足够大的max-msg-size确保完整接收:
source s_udp514 { udp( port(514) flags(syslog-protocol) max-msg-size(1048576) ); };
2. (可选)自定义输出模板确保内容完整
如果默认模板无法输出防火墙日志中的结构化数据(比如[Fields@...]部分),可以在destination中指定自定义模板,明确包含需要输出的字段:
destination d_c2 { file("/var/log/fw-test/${SOURCEIP}/${C_YEAR}-${C_MONTH}-${C_DAY}T${C_HOUR}.log" owner(root) group(splunk) perm(0755) dir_perm(0755) create_dirs(yes) template("$DATE $HOST $TAG: $MESSAGE $SDATA\n") ); };
其中$SDATA字段对应防火墙日志中的结构化数据部分,能确保这部分内容被完整输出。
3. 重启syslog-ng服务
修改配置后,重启服务使设置生效:
systemctl restart syslog-ng
完成以上步骤后,重新测试日志接收,应该就能看到完整的日志内容了。
内容的提问来源于stack exchange,提问作者Ericle

