rsyslog.d目录配置报语法错误,主配置文件却正常运行?
为啥rsyslog配置放rsyslog.d目录就报错,放主配置却正常?
这事儿核心问题出在rsyslog的两种语法模式不兼容上,主配置文件的加载方式直接决定了子配置的解析规则:
- 当你把
if $programname == 'project' then /var/log/file.log直接贴到/etc/rsyslog.conf末尾时,这个主配置文件大概率是用传统语法模式解析的(很多Linux发行版的默认主配置会保留传统语法的兼容,比如用$IncludeConfig这种老指令),所以这条规则能正常工作。 - 但如果你的主配置文件用的是rsyslog v8+推荐的新语法(RainerScript),用
include(file="/etc/rsyslog.d/*.conf")这个指令来加载子配置,那rsyslog.d下的所有文件都会被强制用RainerScript语法解析。而传统写法里then后面直接跟日志路径的格式,在RainerScript里是不合法的——新语法要求then后面必须跟一个代码块,用大括号包裹具体的动作,这就是你看到syntax error on token '=='的原因。
怎么解决?
有两种路子可选:
- 改成RainerScript标准写法(推荐,毕竟是官方主推的新语法):
if $programname == 'project' then { action(type="omfile" file="/var/log/file.log") } - 如果你死磕传统语法,那得检查主配置文件里加载rsyslog.d的那一行,必须是传统的
$IncludeConfig /etc/rsyslog.d/*.conf,而不是RainerScript的include()指令。
快速验证主配置的加载方式
打开/etc/rsyslog.conf搜一下加载rsyslog.d的行:
- 看到
$IncludeConfig:传统语法模式,子配置可以用老写法; - 看到
include(file=...):新语法模式,子配置必须改写法。
内容的提问来源于stack exchange,提问作者Király István




