rsyslog可通过原生模块实现非标端口日志接收、多厂商格式解析及iso时区标准化:一、为5140等端口单独配置imudp/imtcp输入并打标;二、用mmnormalize提取原始时间,显式设置$!timegenerated与$!timezone;三、用date-rfc3339模板输出标准iso格式。

要让 rsyslog 精准接收非标端口(比如 5140、601 等)的日志,并对思科、华为等设备发来的非标准格式日志做字段级重写、时区统一为 ISO 格式(如 2026-05-23T16:51:22+08:00),关键不在改端口本身,而在于协议层隔离 + 解析层校准 + 输出层标准化。整个过程不依赖外部脚本,全部由 rsyslog 原生模块完成。
一、监听非标端口并隔离流量
rsyslog 支持任意端口监听,但必须为每个端口单独声明输入模块和规则,避免与默认 514 端口混用导致解析冲突。-
启用专用模块(推荐使用新版
module()语法,兼容性更好):module(load="imudp")
input(type="imudp" port="5140" name="netdev-udp-5140")
module(load="imtcp")
input(type="imtcp" port="5140" name="netdev-tcp-5140") -
为该端口日志打上唯一标记,便于后续路由:
if $inputname == 'netdev-udp-5140' or $inputname == 'netdev-tcp-5140' then {
set $.src_port = "5140";
set $.is_netdev = "true";
}
二、用 mmnormalize 提取原始时间并覆盖 timegenerated
网络设备日志自带的时间戳(如 `May 23 16:51:22` 或 `2026-05-23 16:51:22 BEIJING`)是本地时区,rsyslog 默认不信任它。需强制提取、转换、注入。-
加载解析模块:
module(load="mmnormalize")
-
在
/etc/rsyslog.d/20-netdev-parse.conf中定义规则(适配多厂商):rule=(%{date=~"\b(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\b"}&%{time=~"\d{2}:\d{2}:\d{2}"}&%{tz=~"[A-Z]{3,4}"}) → json
rule=(%{iso_date=~"\d{4}-\d{2}-\d{2}"}&%{iso_time=~"\d{2}:\d{2}:\d{2}"}&%{tz=~"[A-Z]+|\+[0-9]{2}:[0-9]{2}"}) → json -
提取后立即修正时间字段(关键!):
if $.parsed_time != "" then {
set $!timestamp = $.parsed_time;
set $!timezone = "+08:00"; # 强制东八区
set $!iso_time = $!timestamp + $!timezone;
set $!timegenerated = $!iso_time;
}
三、输出为标准 ISO 时区格式日志行
使用 `$template` 定义带 RFC3339 时间戳的格式,且确保 `timegenerated` 被实际采用(不是 `timereported`):$template ISO8601Format,"%timegenerated:::date-rfc3339% %fromhost-ip% %syslogtag% %msg%
"
*.* ?ISO8601Format
& ~
- 若需按 IP 分目录存储,模板可嵌套:
$template NetDevISO,"/var/log/netdev/%FROMHOST-IP%/%FROMHOST-IP%_%$YEAR%-%$MONTH%-%$DAY%.log"
if $.is_netdev == "true" then ?NetDevISO
& ~
四、验证与避坑要点
- 时区不能靠系统 TZ 环境变量生效:rsyslog 不读取 shell 环境,必须显式设置 `$!timegenerated` 或用 `date-rfc3339` 模板函数。 - 非标端口需同步开放防火墙:firewall-cmd --add-port=5140/udp --permanent
firewall-cmd --add-port=5140/tcp --permanent
firewall-cmd --reload
echo "May 23 16:51:22 R1 %LINEPROTO-5-UPDOWN: ..." | nc -u 192.168.10.100 5140
- 查看是否生效:`tail -f /var/log/netdev/192.168.10.200/192.168.10.200_2026-05-23.log`,应看到形如 `2026-05-23T16:51:22+08:00 192.168.10.200 %LINEPROTO-5-UPDOWN: ...` 的输出。不复杂但容易忽略











