rsyslog lookup table 不支持动态调用 cmdb 接口,但可通过预加载 csv/cidr 映射表实现静态标签注入;需配置 $lookup_table、$!env 等临时字段及 fallback 逻辑,并在模板中引用以落地带标签日志。

rsyslog 的 lookup table 机制本身不支持在日志落地前“动态查询外部 CMDB 接口”并实时注入标签,但它可以实现基于预加载映射关系的静态/半静态标签注入——这是生产环境中稳定、低延迟、可审计的主流做法。关键在于:把 CMDB 的资产维度(如 IP、主机名、服务名)与业务标签(如 env=prod、app=payment、owner=finance)预先构建成结构化 lookup 表,再在 rsyslog 规则中通过 $lookup 函数匹配并添加字段。
准备 CMDB 标签映射表文件
在 /etc/rsyslog.d/tables/ 下创建 CSV 或 key-value 格式的 lookup 表,例如 cmdb_tags.csv:
- 格式必须严格:首行为字段名(如
ip,env,app,owner),后续每行一条资产记录;IP 支持 CIDR 段(需启用cidr类型) - 示例内容:
10.20.30.100,prod,payment,gateway-team<br>10.20.30.0/24,prod,core-api,backend-team<br>web01.example.com,stage,portal,frontend-team
- 保存后执行
rsyslogd -N1验证语法,确保无报错
在 rsyslog 配置中加载并引用 lookup 表
编辑 /etc/rsyslog.d/50-cmdb-tagging.conf,启用 imfile 或 imuxsock 输入后,插入如下配置:
- 用
$template定义带标签的日志格式,例如:$template CmdbTaggedFormat,"%timestamp% %hostname% %syslogtag%%msg% [env=%$!env%, app=%$!app%, owner=%$!owner%]\n" - 用
lookup_table加载 CSV:$lookup_table name="cmdb_tags" file="/etc/rsyslog.d/tables/cmdb_tags.csv" type="csv" - 在规则中提取字段并查表:
if $fromhost-ip != '127.0.0.1' then {<br>& set $!env = lookup("cmdb_tags", $fromhost-ip);<br>& set $!app = lookup("cmdb_tags", $fromhost-ip, "app");<br>& set $!owner = lookup("cmdb_tags", $fromhost-ip, "owner");<br>}
处理主机名匹配与 fallback 逻辑
CMDB 中常同时存有 IP 和 hostname,而 rsyslog 默认可能只解析出 IP(尤其经 NAT 后)。需增强健壮性:
- 优先按
$fromhost-ip查表;未命中时,再尝试$hostname或$fromhost-name - 用
if not判断空值,设置默认标签:if $!env == "" then & set $!env = "unknown"; - 若需 CIDR 匹配(如网段归属),将
type="csv"改为type="cidr",且 CSV 第一列必须是 CIDR 表达式
落地前注入到输出目标
标签已作为临时属性($!env 等)存在于消息上下文中,可直接用于文件写入、远程转发或 JSON 封装:
- 写本地文件:
*.* /var/log/tagged/app.log;CmdbTaggedFormat - 转发至 Logstash/Elasticsearch:
action(type="omfwd" protocol="tcp" target="logstash.internal" port="5044" template="CmdbTaggedFormat") - 生成标准 JSON(需启用
mmjsonparse或mmfields模块):$template JsonWithTags,"{ \"@timestamp\":\"%timestamp:::date-rfc3339%\", \"host\":\"%hostname%\", \"message\":\"%msg%\", \"env\":\"%$!env%\", \"app\":\"%$!app%\" }"











