Rsyslog截断超过48字符的App-Names配置不生效问题排查
配置未生效的可能原因
- 未校验配置语法、未重启服务
修改配置后首先执行rsyslogd -N1校验配置是否存在语法错误,确认无报错后必须重启rsyslog服务(对应命令systemctl restart rsyslog)才能使新规则生效,部分场景下reload操作不会加载新增的变量和模板规则。 - Rsyslog版本不兼容语法
你用到的set变量赋值、新式template写法属于RainerScript语法,仅在rsyslog 7.5及以上版本支持,如果系统安装的是更早的旧版本,这类配置会被直接忽略。 - set变量的执行时机错误
当前你把set $.APPNAME47 = substring($app-name, 0, 47);放在全局配置段,该语句只会在rsyslog进程启动时执行一次,不会对每一条收到的日志单独计算变量值。正确做法是无需单独声明变量,直接在template内调用substring函数即可,把模板中的%$.APPNAME47%替换为%substring($app-name,0,47)%即可。 - 日志格式不匹配导致属性取值为空
$app-name是RFC5424格式日志的专属属性,如果你收到的是旧的RFC3164(BSD syslog)格式的日志,$app-name属性会为空,此时你应该替换为$programname属性来获取程序名再做截断。 - 截断长度参数不符合预期
substring函数的第三个参数为截取长度,你当前配置的参数是47,最终得到的App-Names最长为47字符,如果要保留48字符可以将参数调整为48。
修正后的参考配置
$ActionQueueType LinkedList $ActionQueueFileName srvrfwd $ActionResumeRetryCount -1 $ActionQueueSaveOnShutdown on $ModLoad imudp #loads the udp module $UDPServerAddress XX.XX.YY.ZZ $UDPServerRun 514 template(name="trimmer" type="string" string="<%PRI%>1 %TIMESTAMP:::date-rfc3339% %HOSTNAME% %substring($programname,0,48)% %PROCID% %MSGID% %STRUCTURED-DATA% %msg%\n") *.* @127.0.0.1:6514;trimmer
内容的提问来源于stack exchange,提问作者Peder Zickler
相关产品推荐
相关产品推荐

