Rsyslog 解析问题 - 发送到 Rsyslog 的 syslog 消息中没有标头

Posted

技术标签:

【中文标题】Rsyslog 解析问题 - 发送到 Rsyslog 的 syslog 消息中没有标头【英文标题】:Rsyslog parsing issue - no header in syslog message that is sent to Rsyslog 【发布时间】:2020-07-17 16:07:16 【问题描述】:

我有一个设备,它通过 TCP 将日志作为 JSON 流发送到 Rsyslog 服务器。但是它不会在系统日志消息中放置任何标题。发送的示例原始消息如下:

"query_class":"C_INTERNET","source_ip":"10.1.1.1","query_type":"A","trans_id":502,"err_code":"NXDOMAIN","@type":"dns","dest_ip":"10.10.10.1","dest_port":53,"uid":"CDdCwH1lD2ToFS5y02","epochdate":1595000476.3491,"query":"www.google.com","@host":"host-10-01","rejected":true,"source_port":54764,"proto":"udp"

Rsyslog 将此消息转发到另一台服务器,并以如下格式放置标头(未应用模板):

<13>Jun 16 10:43:09 host01.example.local

我不知道这个标头来自哪里(当消息中没有标头时,可能会应用默认配置)。

问题是,标头中缺少 TAG,导致原始消息解析不正确。

当 Rsyslog 将日志转发到另一台机器或将其写入文件时,它的外观是这样的:

<13>Jun 16 10:43:09 host01.example.local "query_class" "C_INTERNET","source_ip":"10.1.1.1","query_type":"A","trans_id":502,"err_code":"NXDOMAIN","@type":"dns","dest_ip":"10.10.10.1","dest_port":53,"uid":"CDdCwH1lD2ToFS5y02","epochdate":1595000476.3491,"query":"www.google.com","@host":"host-10-01","rejected":true,"source_port":54764,"proto":"udp"

"query_class" 被提取并成为标签(“:”被删除)。其余的成为系统日志消息。

很遗憾,无法在源头进行任何更改来配置标头。 如何在 Rsyslog 中向此原始消息添加标头并将其转发到另一台远程计算机或将其写入文件?或者,如何更改默认标头配置以添加自定义进程名称标记(如果应用了默认配置)?

【问题讨论】:

【参考方案1】:

rsyslog 可能正在使用RSYSLOG_TraditionalForwardFormat 的默认模板omfwd,即:

template(name="RSYSLOG_TraditionalForwardFormat" type="string"
     string="<%PRI%>%TIMESTAMP% %HOSTNAME% %syslogtag:1:32% %msg:::sp-if-no-1st-sp%%msg%")

定义您自己的模板并在您的转发规则中使用它,例如:

template(name="myfwd" type="string"
     string="<%PRI%>%TIMESTAMP% %HOSTNAME% dummytag %rawmsg%\n")
if $fromhost == 'thehost' then 
    action(type="omfwd" target="theserver" protocol="tcp" template="myfwd")

   

【讨论】:

以上是关于Rsyslog 解析问题 - 发送到 Rsyslog 的 syslog 消息中没有标头的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 rsyslog 仅将特定文件发送到远程服务器

rsyslog转发nginx日志(rsyslog发送到logstashh)

rsyslog 在远程启动时发送日志

日志分析-2.发送windows日志到一个远程的rsyslog服务器上

rsyslog

从 python 脚本登录到 rsyslog 工具