使用grouping-by()的syslog-ng解析器因语法错误启动失败
问题:syslog-ng grouping-by解析器启动失败,语法错误提示意外分号
配置自定义syslog-ng解析器p_correlate_session_data(使用grouping-by())时,syslog-ng启动失败,错误日志提示/etc/syslog-ng/conf.d/network-ulogd2.conf第33行存在语法错误,意外出现分号;,期望为右括号)。注释该解析器配置后syslog-ng可正常启动,已检查括号匹配并查阅官方文档,仍未解决。
配置代码
16 parser p_correlate_session_data { 17 grouping-by( 18 key("${source.ip}/${destination.ip}/${source.port}/${destination.port}") 19 scope("host") 20 where(match("ORIG" value("MESSAGE"))) 21 trigger(match("DESTROY" value("MESSAGE"))) 22 having( "${UNIXTIME}@2" ne "1" ) 23 aggregate( 24 value("event.start" "${ISODATE}@2") 25 value("event.end" "${ISODATE}@1") 26 value("event.duration", "$(- ${UNIXTIME}@1 ${UNIXTIME}@2)") 27 value("MESSAGE" "Session completed; client='${source.ip}'; server='${destination.ip}'; destination_port='${destination.port}'; protocol='${network.transport}'; session_lenght='${event.duration}'\n") 28 inherit-mode("context") 29 ) 30 inject-mode("pass-through") 31 # destroy events sometimes arrive later than 2 minutes, even when a client app is already closed (ssh, telnet) 32 timeout(600) 33 ); 34 };
错误日志
syslog-ng[5897]: Error parsing dbparser, syntax error, unexpected ';', expecting ')' in /etc/syslog-ng/conf.d/network-ulogd2.conf> syslog-ng[5897]: 28 inherit-mode("context") syslog-ng[5897]: 29 ) syslog-ng[5897]: 30 inject-mode("pass-through") syslog-ng[5897]: 31 # destroy events sometimes arrive later than 2 minutes, even when a client app is already closed> syslog-ng[5897]: 32 timeout(600) syslog-ng[5897]: 33----> ); syslog-ng[5897]: 33----> ^ syslog-ng[5897]: 34 }; syslog-ng[5897]: 35 syslog-ng[5897]: 36 template t_network { syslog-ng[5897]: 37 template("$(format_json --omit-empty-values --pair host.name=$HOST --pair host.hostname=$HOST --pair> syslog-ng[5897]: 38 };
解决建议
- 修正
aggregate块内的value语法:第26行的value("event.duration", "$(- ${UNIXTIME}@1 ${UNIXTIME}@2)")使用了逗号分隔参数,syslog-ng的value()参数需用空格分隔,将逗号改为空格:value("event.duration" "$(- ${UNIXTIME}@1 ${UNIXTIME}@2)") - 检查字符串内特殊字符:第27行
MESSAGE值中的分号可能干扰旧版本syslog-ng的解析,可尝试将整个字符串用单引号包裹,或把分号转义为\; - 验证版本兼容性:确认使用的syslog-ng版本支持
inherit-mode、inject-mode等参数,部分旧版本对grouping-by()的语法要求更严格 - 排查注释干扰:将第31行的注释移至
grouping-by()块外,或临时删除注释后测试启动 - 提前验证配置:执行
syslog-ng -s -f /etc/syslog-ng/conf.d/network-ulogd2.conf(或对应主配置文件),获取更精准的语法错误提示,定位真正的问题行
内容的提问来源于stack exchange,提问作者phanxen
相关产品推荐
相关产品推荐

