Akemi

Linux日志管理工具Rsyslog

2026/03/04

日志分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/var/log/message 系统通用日志,通常由rsyslog或syslog管理
/var/log/dmesg 内核缓冲区日志,主要包含启动时内核与硬件信息
/var/log/boot.log 专门记录系统启动过程中的事件,包含服务启动顺序成功/失败
/var/log/cron 定时任务日志
/var/log/maillog RHEL系系统邮件日志
/var/log/mail.log Debian系系统邮件日志
/var/log/firewalld firewalld服务运行状态
/var/log/nftables nftables服务日志

# 安全日志
/var/log/secure RHEL系PAM日志
/var/log/auth.log Debian系PAM日志
/var/log/audit/audit.log selinux日志
/var/log/sudo.log sudo日志

# 日志发展
syslog → rsyslog → systemd-journald → 分布式日志系统

日志管理工具syslog

在类unix操作系统上,syslog广泛应用于系统日志,既可以记录在本地文件中,也可以通过网络发送到接受syslog的服务器,syslogd监听udp 514端口

在syslog日志中,包含能够产生日志的程序模块(Facility)、严重性(Serverity)、时间、主机名、进程名、进程ID和正文

在unix类操作系统上,能够按照Facility+Serverity的组合来决定什么样的日志需要被记录,记录到什么地方,是否需要发送到一个接受syslog的服务器

  • 发送syslog的设备Device
  • 转发syslog的设备Relay
  • 接收syslog的设备Collector

上面的角色是可以重合的,取决于如何配置syslog

syslog的优点

1.几乎所有类unix系统、网络设备、软件都支持syslog
2.简单轻量
3.易于实现和集成
4.集中化管理 ,可以发送到中央日志服务器
5.解耦 异步通信,无需等待接收方确认,保证了应用程序自身的性能

syslog的缺点

1.缺乏标准化的消息格式,需要为不同的日志编写特定的协议规则,才能提取结构化字段
2.安全和可靠性问题,使用udp时,消息可能会丢失、重复、乱序
3.时间同步问题,本身包含时间戳,但如果发送设备的时钟不准,日志信息就会出错
4.可扩展性调整,海量日志下syslog面临性能瓶颈

Rsyslog

rocket-fast syslog,是linux现在默认的syslog守护进程,完全兼容传统的syslogd

主要特性

1.高性能处理,使用内存队列和
2.丰富协议支持,支持udp tcp ssl等方式接受日志,支持发给es kafka
3.过滤与处理能力,能实现基于属性的过滤,比如主机名、程序名、严重性、设施等,并且支持正则表达式,可以自定义输出格式
4.可靠性和安全性,使用RELP协议,提供可靠的确认机制的日志传输
5.模块化设计,把整体功能拆分成独立功能模块,每个模块只负责一项具体任务,可以按需加载/卸载

Rsyslog三层架构

rsyslog使用分层模块化概念,通过模块扩展功能,三层协同完成日志接收→处理→分发链路流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 输入层(日志接收入口
接收来自不同来源的日志,是日志流转的起点,所有输入均通过输入模块实现,支持多样化的日志接入方式
输入层模块可以通过启用多个,所有接入的日志会统一传递到处理层,进入核心转发引擎等待处理

模块名 输入方式 场景
imudp udp协议514 简单远程日志接收
imtcp tcp协议514 可靠远程日志接收
imrelp RELP可靠事件日志协议 关键业务日志可靠传输
imuxsock unix本地套接字 接收本地应用日志nginx mysql
imjournal 对接systemd-journald 接收journald采集的系统/服务日志
imklog 读取内核缓冲区 接收内核日志
imfile 监控本地文件 采集自定义文件日志

# 处理层
对输入层接收的日志进行过滤、格式化、修改,是rsyslog逻辑控制的核心,通过规则集和过滤器定义日志规则
但一般运维不需要修改这个,都是照单全收
(1)规则集,定义完整的过滤逻辑+处理动作
(2)过滤器,日志筛选的条件判断,基于设施、优先级、关键词、ip等维度筛选日志
(3)日志处理动作,通过模板将日志转换为指定格式;字段修改;通过forward链将日志转发到其他输出层;修改日志等级
(4)工作逻辑,输入层的日志会先进入默认规则集,或通过配置进行某一规则集,处理完成后的日志传递到输出层,最终进行分发

# 输出层
将处理层处理后的日志分发到指定目标,所有输出均通过输出模块output module实现,支持本地存储、远程转发、数据库落盘等多样化输出方法
可以启用多个输出模块,比如既写入本地,又转发到远程ELK
支持级联输出,如日志先写入本地文件,再转发到远程服务器

Rsyslog的工作模式

1
2
3
4
5
6
7
8
9
# 执行方式
阻塞/非阻塞
IO同步/异步
$ActionFileAsyncWeite on 启用异步写入
$ThreadPoolSize 8 异步线程处理数

特殊模式:可靠传输模式
1.基于RELP,即使网络中断或服务重启,也能避免日志丢失,适用于关键业务日志传输
2.基于磁盘队列的可靠处理,一般用于本地日志

Rsyslog配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 配置文件路径和加载顺序
/etc/rsyslog.conf 主配置文件
/etc/rsyslog.d/*.conf 子配置文件
先加载主,再加载子,子中重复的覆盖主

# 配置文件格式
1.模块加载区
module(load="imjournal")
module(load="omfwd")

2.全局配置区
定义rsyslog全局参数,如日志文件权限、缓存、模板格式
$FileOwner
$Umask
...

3.日志规则区
定义哪些日志执行什么操作,是日志分流,存储转发的核心规则
(1)日志筛选规则selector
日志筛选规则由facility.priority组成,支持通配符
facility表示日志来源分类,如authpriv认证日志
priority表示日志等级,如info,err

特殊符号
. 仅匹配指定等级及以上
; 多规则拼接
.= 仅匹配制定登记
.! 排除指定等级

来看看默认规则
*.info;mail.none;authpriv.none;cron.none /var/log/message
任何进程的info及以上级别的日志;但认证、计划任务的日志不要

authpriv.* /var/log/secure
认证的日志

mail.* -/var/log/maillog
mail的日志

(2)日志动作
表示日志的处理方式
本地文件: /var/log/message 日志写入指定文件
远程转发: @192.168.1.100:514(udp);@@192.168.1.100:514(tcp)
管道: |/usr/bin/logger 通过管道传给指定程序
数据库(引用其他模块): :ommysql:127.0.0.1,dbname,user,password(写入mysql数据库)
丢弃: ~ local7.* ~

*.emerg :omusrmsg:*
emerg等级以上的日志,调用omusrmsg模块(展示在控制台

(3)日志模板
用于自定义日志格式,比如json,默认使用系统模板
template(name="JSONTEMPLATE".xxxx)

authpriv.* /var/log/secure;JSONTEMPLATE 应用该模板

Rsyslog接管firewalld日志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
firewalld默认仅将日志输出到内核缓冲区,可以配合rsyslog或systemd-journald实现日志持久化存储和集中管理

# 调整firewalld日志选项
/etc/firewalld/firewalld.conf
...
LogDenied=all
...

systemctl restart firewalld.service

/var/log/firewalld 并非这个日志文件,这个仅记录配置变更记录

# 修改rsyslog配置文件,接管firewalld的日志
firewalld日志属于kern.* 即内核级日志

kern日志默认是在/var/log/message中的,但我们直接创建一个子配置文件就可以覆盖这部分配置
kern.*:meg,contains,"_REJECT" -/var/log/firewalld_deny.log & stop

msg表示匹配syslog的消息字段
containers匹配运算符,包含关系
_REJECT表示匹配关键字为"_REJECT"
-代表异步写入
& 表示进行后续处理
stop 表示该日志不会再匹配其他rsyslog规则,也不会写入message

echo 'kern.*:msg,contains,"_REJECT" -/var/log/firewalld_deny.log & stop' > /etc/rsyslog.d/firewall.conf

systemctl restart rsyslog.service

# 新版可以这么加
cat > /etc/rsyslog.d/firewall.conf <<'EOF'
if ($msg contains "_REJECT") then {
action(type="omfile" file="/var/log/firewalld_deny.log")
stop
}
EOF

rsyslogd -N1 # 检查rsyslog配置文件格式是否正确
systemctl restart rsyslog.service

tail -f /var/log/firewalld_deny.log
Feb 12 10:59:16 1panel kernel: filter_IN_public_REJECT: IN=ens18 OUT= MAC=01:00:5e:00:00:01:34:ce:00:65:66:0f:08:00 SRC=0.0.0.0 DST=224.0.0.1 LEN=32 TOS=0x00 PREC=0xC0 TTL=1 ID=0 DF PROTO=2
Feb 12 10:59:36 1panel kernel: filter_IN_public_REJECT: IN=ens18 OUT= MAC=01:00:5e:00:00:fb:bc:24:11:9d:13:d4:08:00 SRC=192.168.10.238 DST=224.0.0.251 LEN=67 TOS=0x00 PREC=0x00 TTL=1 ID=36040 PROTO=UDP SPT=5353 DPT=5353 LEN=47
...

CATALOG
  1. 1. 日志管理工具syslog
  2. 2. Rsyslog
    1. 2.1. Rsyslog三层架构
    2. 2.2. Rsyslog的工作模式
    3. 2.3. Rsyslog配置文件
    4. 2.4. Rsyslog接管firewalld日志