syslog-ng接收JSON日志丢失input_name字段问题求助
问题原因与解决方案
这个问题的核心是syslog-ng默认的UDP源会自动尝试解析消息为标准syslog格式,而你发送的是纯JSON数据,没有符合syslog的头部结构,导致解析出错,丢失了部分内容。
具体原因
syslog-ng的UDP源默认启用了syslog格式解析(对应RFC 3164或RFC 5424规范),当它收到像{"input_name":"sensor_alert","machine":"10.200.249.27"}这样的纯JSON时,会错误地把input_name识别为syslog的「程序名称(TAG)」字段,然后将剩下的"sensor_alert","machine":"10.200.249.27"}作为消息体(也就是$MSG变量的内容),最终写入文件时就丢失了{"input_name":这部分。
解决方案
修改你的UDP源配置,添加flags(no-parse)选项,让syslog-ng跳过syslog格式解析,直接保留原始接收的完整数据:
source test_src { udp( ip(0.0.0.0) port(5115) flags(no-parse) ); }; destination test_dest { file("/data/test_${YEAR}${MONTH}${DAY}.log" template("$MSG\n") template-escape(no)); }; log { source(test_src); destination(test_dest); };
说明
flags(no-parse)会告诉syslog-ng不要尝试提取syslog的元数据(比如优先级、标签、时间戳等),完全按照原始字节流处理接收到的内容,这样就能完整保存你的JSON日志结构了。
内容的提问来源于stack exchange,提问作者Perling
相关产品推荐
相关产品推荐

