rsyslog的语法大白话
用“物流公司运作手册”的大白话,把 rsyslog 语法分成 4 大类
第一类:开窗口、定模板(声明式语法)
这类语法的特征是 module 和 template,它们是在做“开工前的准备”。
- module(load="imxxx") —— 开设收货窗口
语法:module(load="模块名" 参数1="值1" ...)
大白话:老板发话,“去市面上雇一个专门收 UDP 货的前台(imudp),再雇一个专门抄文件的前台(imfile)”。没有这行,对应的门就没开,日志进不来。 - template(...) —— 定制打印标签/货架
语法:template(name="名字" type="string" string="格式字符串")
大白话:定制包裹上的面单怎么印(比如加上年月日),或者定制仓库里的货架怎么命名(比如按日期分 nginx-access-%$year%...)。这是纯纯的定义,定义好了等后面用。第二类:老爷爷语法(传统选择器语法)
这是 40 年前老 Unix 留下来的语法,非常简练,但乍一看像乱码。常见于配置文件的后半段,专门用来做默认的基础分拣。
语法结构:设施.级别 动作(放哪去) - 设施(哪个部门):
*:所有部门
mail:收发室
kern:内核部
local0~local7:自定义部门(咱们给 Nginx 安排的 local5) - 级别(多紧急):(从轻到重)
debug -> info -> notice -> warn -> err -> crit -> alert -> emerg
重点坑:写 info,意思是 info 及以上(包含 warn, err 等)。 - 特殊符号(排雷指南):
.info:所有部门的 info 及以上。
mail.=info:加个 =,表示仅限 info,warn 和 err 不要。
mail.none:收发室的任何级别都拉黑(上次你问的重点!)。
mail,authpriv.info:逗号表示“收发室和保安部的 info”。
.info;mail.none:分号表示“并且”。翻译:所有部门的 info,并且收发室拉黑。 - 动作(放哪去):
/var/log/messages:写本地文件。
@192.168.1.1:514:一个 @,用 UDP 自行车发货。
@@192.168.1.1:514:两个 @,用 TCP 卡车发货。
老爷爷语法总结:一眼看过去,只要没有 if,全是 点点点 空格 路径 的,就是它在干活。简单粗暴,但写复杂逻辑容易乱。第三类:现代编程语法(RainerScript)
为了解决老爷爷语法写不出复杂逻辑的问题,rsyslog 发明了新语法。也就是你配置里前面那段 if...then。这是咱们现在写复杂规则的主力。
- input(type="imxxx" ...) —— 给开好的窗口派活
大白话:窗口开好了(module 开的),现在告诉窗口:“你去读 /www/log 目录,给进来的货贴上 local5 和 nginx-access 的标”。 - if $变量 == "值" then { ... } —— 智能分拣流水线
语法:if 判断条件 then { 执行动作 }
大白话:分拣主管的判断逻辑。
常用变量(看货物的特征):
$fromhost-ip:看发货地址(是 91 发来的吗?)
$programname:看胸牌(是 nginx-access 吗?)
$msg:看包裹里的内容(包含 "error" 吗?)
判断符号:== (等于), != (不等于), contains (包含) - action(type="omxxx" ...) —— 发货动作
大白话:满足条件后怎么处理。
常见 type:
omfile:写本地文件(放仓库)。
omfwd:转发到远程(发货),通常用老爷爷语法的 @@ip 替代更省事。
dynaFile="模板名":配合前面讲的 template,扔进按日期动态变化的货架上。 - stop —— 截胡!到此为止!
大白话:极其重要!包裹进了这个仓库后,立刻停止往下走,后面的规则全都不看了。
如果不加 stop,日志就会“顺流而下”,被后面的规则重复处理,导致一条日志出现在多个文件里。第四类:古董指令(美元符号 $)
你在配置里看到的 $FileCreateMode 0600 等,这是比老爷爷还老的指令。
特征:以 $ 开头。
大白话:这叫“全局环境变量”。就像是在物流公司墙上贴的告示:“今天所有新建的仓库,权限都必须是 0600!”
现状:rsyslog 现在不太推荐用这种写法了,但为了兼容旧配置,你还会经常看到。不用深究,知道它是设置全局参数的就行。🏆 终极记忆口诀
module 开门,template 造架。(准备阶段)
input 贴标,if 来分叉。(处理阶段)
action 决定去哪,stop 截胡不发。(输出阶段)
老语法 *.info 管默认,none 拉黑防混杂。(兜底阶段)
一个 @ 走 UDP,两个 @ 走 TCP。(发货阶段)