Ubuntu环境下Yocto Project中自定义rsyslog规则无法写入指定文件
问题根源分析
从你给出的日志格式能直接定位问题:
- 用
logger命令测试时,日志是符合syslog规范的结构化格式,rsyslog能正确提取$programname字段,所以规则生效。 - 但实际程序输出的正确程序名(diagnostic)的日志是非结构化的,没有包含
programname的标识字段,rsyslog根本无法识别这条日志的程序名为diagnostic,自然不会触发你的路由规则。 - 而拼写错误(iagnostic)时的日志是标准RFC5424格式,包含明确的程序名字段,rsyslog能识别,但这不是你要的目标程序名。
解决方案
方案1:修改程序日志输出方式(推荐)
让程序通过syslog接口发送日志,而不是直接打印到标准输出/错误。比如在代码里调用syslog相关库(Python的logging.handlers.SysLogHandler、C语言的syslog()函数),指定程序名为diagnostic。这样日志会以结构化的syslog格式发送给rsyslog,你的现有规则就能正常匹配。
方案2:修改rsyslog规则适配非结构化日志
如果无法修改程序代码,只能基于日志内容的特征来匹配:
比如如果日志里固定包含"Diagnostic from"这样的关键词,可修改00-myApp-rsyslog.conf:
if $msg contains 'Diagnostic from' then /var/log/myApp-diagnostics.log & stop
或者结合固定主机字段强化匹配:
if $hostname == 'qemux86-64' and $msg contains 'Diagnostic from' then /var/log/myApp-diagnostics.log & stop
注意:这种基于内容匹配的方式可靠性不如结构化字段匹配,一旦日志内容格式变化,规则就会失效。
额外检查点
确认实际程序的日志是直接输出到syslog,还是先到systemd journal再转发到rsyslog。如果是后者,需要确保/etc/systemd/journald.conf中ForwardToSyslog=yes,且转发时保留程序元数据。
内容的提问来源于stack exchange,提问作者Miss Anfa
相关产品推荐
相关产品推荐

