rsyslog采集日志端口转发

本文为博主独立完成的原创技术文档,首发于个人博客。
转载须知:
✅ 欢迎分享本文链接至技术群、朋友圈
✅ 个人收藏、学习使用不限
❌ 严禁洗稿、抄袭,或未经授权的商业转载/汇编
📩 如需转载至其他平台,请私信联系博主获取授权

作者:赵俊杰

一.文章概述

本文主要介绍在 Linux 系统中使用 rsyslog 的 imfile 模块采集本地指定路径下的自定义日志,并通过 TCP 协议转发至中转机指定端口的完整实现方法。文章以 rsyslog 8.2112.0 为例,配置监控 /tmp/*.txt,打上 oceanbase: 标签,使用 local6.info 级别,将匹配日志通过 omfwd 转发到 10.0.0.10:8888,并通过 rsyslogd -N1 语法检查、模拟日志生成、nc 端口监听、netstat 端口检查、tcpdump 抓包和重启服务等步骤验证转发效果。本文目的在于帮助读者掌握 rsyslog 自定义日志采集与端口转发配置,能够独立完成部署、测试和排查;实际使用时需确保中转机端口已监听且开放、采集路径存在、配置语法正确,多行日志需根据实际格式调整 startmsg.regex,若均为单行日志可删除该项。

二.rsyslog配置采集日志端口转发

2.1 登录机器检查rsyslog版本

root@zhaojunjie-node:~# rsyslogd -v
rsyslogd  8.2112.0 (aka 2021.12) compiled with:
        PLATFORM:                               x86_64-pc-linux-gnu
        PLATFORM (lsb_release -d):
        FEATURE_REGEXP:                         Yes
        GSSAPI Kerberos 5 support:              Yes
        FEATURE_DEBUG (debug build, slow code): No
        32bit Atomic operations supported:      Yes
        64bit Atomic operations supported:      Yes
        memory allocator:                       system default
        Runtime Instrumentation (slow code):    No
        uuid support:                           Yes
        systemd support:                        Yes
        Config file:                            /etc/rsyslog.conf
        PID file:                               /run/rsyslogd.pid
        Number of Bits in RainerScript integers: 64

See https://www.rsyslog.com for more information.
root@zhaojunjie-node:~#

2.2 检查rsyslog系统配置以及版本情况

进入工作目录,查看默认系统配置并检查语法结构:

root@zhaojunjie-node:~#
root@zhaojunjie-node:~# cd /etc/rsyslog.d/
root@zhaojunjie-node:/etc/rsyslog.d# ls -l
total 24
-rw-r--r-- 1 root root  440 Sep 26 04:24 00-global.conf
-rw-r--r-- 1 root root  293 Sep 26 04:24 01-ob-8888.conf
-rw-r--r-- 1 root root  293 Sep 26 04:24 02-ob-9999.conf
-rw-r--r-- 1 root root  314 Sep 19  2021 20-ufw.conf
-rw-r--r-- 1 root root  255 Oct 24  2023 21-cloudinit.conf
-rw-r--r-- 1 root root 1124 Nov 16  2021 50-default.conf
root@zhaojunjie-node:/etc/rsyslog.d# rsyslogd -N1
rsyslogd: version 8.2112.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

默认系统配置展示:

root@zhaojunjie-node:/etc/rsyslog.d# cat 20-ufw.conf
# Log kernel generated UFW log messages to file
:msg,contains,"[UFW " /var/log/ufw.log

# Uncomment the following to stop logging anything that matches the last rule.
# Doing this will stop logging kernel generated UFW log messages to the file
# normally containing kern.* messages (eg, /var/log/kern.log)
#& stop
root@zhaojunjie-node:/etc/rsyslog.d# cat 21-cloudinit.conf
# Log cloudinit generated log messages to file
:syslogtag, isequal, "[CLOUDINIT]" /var/log/cloud-init.log

# comment out the following line to allow CLOUDINIT messages through.
# Doing so means you'll also get CLOUDINIT messages in /var/log/syslog
& stop
root@zhaojunjie-node:/etc/rsyslog.d# cat 50-default.conf  |grep -v "^#"

auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
kern.*                          -/var/log/kern.log
mail.*                          -/var/log/mail.log

mail.err                        /var/log/mail.err


*.emerg                         :omusrmsg:*

root@zhaojunjie-node:/etc/rsyslog.d#

2.3 配置配置文件

创建采集日志并且端口转发配置:

root@zhaojunjie-node:/etc/rsyslog.d# cat 100-test-log.conf
global(MaxMessageSize="1024k")
module(load="imfile" PollingInterval="10")
input(
type="imfile"
File="/tmp/*.txt"
Tag="oceanbase:"
Facility="local6"
Severity ="info"
PersistStateInterval="300"
#startmsg.regex="^\"[0-9]{1,3}(\\.[0-9]{1,3}){3}\""
escapeLF="on"
MaxSubmitAtOnce="1000"
)
if $programname startswith 'oceanbase' then
{
action(type="omfwd"
target="10.0.0.10"
port="8888"
protocol="tcp")
stop
}

注意:
startmsg.regex这个配置是用来匹配日志中的多行配置,可以根据实际日志进行改写,如果都是一行日志则将此配置删除就行了。
自定义配置说明:

global(MaxMessageSize="1024k"):设置 rsyslog 全局单条消息最大为 1MB,防止大日志被截断。

module(load="imfile"):加载 imfile 模块,用于监控普通文本文件。

PollingInterval="10":每 10 秒轮询一次被监控文件。

type="imfile":输入类型为文件监控。

File="/tmp/*.txt":监控 /tmp 目录下所有 .txt 文件。

Tag="oceanbase:":给读取到的日志打上标签 oceanbase:。

Facility="local6":日志 facility 使用 local6。

Severity="info":日志级别设置为 info。

PersistStateInterval="300":每处理 300 条消息保存一次读取位置,重启后尽量从上次位置继续。

#startmsg.regex=...:已被注释,不生效;原本用于多行日志合并,表示以双引号 IP 开头的行为新消息。

escapeLF="on":转义换行符,避免多行内容破坏 syslog 消息格式。

MaxSubmitAtOnce="1000":一次最多提交 1000 条消息。

if $programname startswith 'oceanbase':判断程序名是否以 oceanbase 开头。

action(type="omfwd"):使用 omfwd 输出模块转发日志。

target="10.0.0.10":转发目标 IP 是 10.0.0.10。

port="8888":转发目标端口是 8888。

protocol="tcp":使用 TCP 协议转发。

stop:匹配并转发后停止处理,不再执行后续 rsyslog 规则。

生成模拟的日志:

root@zhaojunjie-node:/etc/rsyslog.d# echo 1111111111111111 >> /tmp/1.txt
root@zhaojunjie-node:/etc/rsyslog.d#

检查配置语法:

root@zhaojunjie-node:/etc/rsyslog.d# rsyslogd -N1
rsyslogd: version 8.2112.0, config validation run (level 1), master config /etc/rsyslog.conf
rsyslogd: End of config validation run. Bye.

2.4 模拟端口监听并重启服务

再次打开一个终端,模拟监听端口:

zhaojunjie@zhaojunjie-node:~$ sudo -i
[sudo] password for zhaojunjie:
root@zhaojunjie-node:~# nc -l 10.0.0.10 8888


image
再次打开一个终端,检查端口监听情况:

root@zhaojunjie-node:~# netstat -tnulp | grep 8888
tcp        0      0 10.0.0.10:8888          0.0.0.0:*               LISTEN      6321/nc
root@zhaojunjie-node:~#

image
在检查端口监听的机器,开启tcp抓包:
检查网卡配置,用来确认抓包目标:

root@zhaojunjie-node:~# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 00:0c:29:71:de:7c brd ff:ff:ff:ff:ff:ff
    altname enp2s1
    inet 10.0.0.10/24 brd 10.0.0.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe71:de7c/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:54:cd:4f:2a brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
root@zhaojunjie-node:~#

开启tcp抓包:

root@zhaojunjie-node:~# tcpdump -i lo port 8888 -nn -A
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on lo, link-type EN10MB (Ethernet), snapshot length 262144 bytes


image
回到第一个终端,重启服务:

root@zhaojunjie-node:/etc/rsyslog.d# systemctl restart rsyslog.service
root@zhaojunjie-node:/etc/rsyslog.d#

检查抓包情况,以及端口接受情况:
image

image

再次生成模拟日志:
image

再次查看抓包情况,以及日志监听情况:
image

image
到此通过rsyslog采集自定义路径日志转发至端口全部配置完成。

你现在的努力,也许暂时看不到花开,但请相信,种子正在你看不见的土里扎根。

posted @ 2026-09-27 19:55  超级喜欢下雨天  阅读(2)  评论(0)    收藏  举报