You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

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 '=='的原因。

怎么解决?

有两种路子可选:

  1. 改成RainerScript标准写法(推荐,毕竟是官方主推的新语法):
    if $programname == 'project' then {
        action(type="omfile" file="/var/log/file.log")
    }
    
  2. 如果你死磕传统语法,那得检查主配置文件里加载rsyslog.d的那一行,必须是传统的$IncludeConfig /etc/rsyslog.d/*.conf,而不是RainerScript的include()指令。

快速验证主配置的加载方式

打开/etc/rsyslog.conf搜一下加载rsyslog.d的行:

  • 看到$IncludeConfig:传统语法模式,子配置可以用老写法;
  • 看到include(file=...):新语法模式,子配置必须改写法。

内容的提问来源于stack exchange,提问作者Király István

火山引擎 最新活动