第 87 课 - syslog 与 rsyslog 集中日志
所属模块:系统监控与调优
难度:Advanced
标签:syslog, rsyslog, 集中日志, 日志服务器
先修知识:第 86 课 - 日志管理与 logrotate
1. 学习目标
完成本课学习后,你将能够:
- 理解传统
syslog服务的架构及其局限性。 - 掌握现代
rsyslog的增强特性与模块化配置。 - 配置一台
rsyslog服务器,用于接收来自网络内其他主机(客户端)的日志。 - 配置客户端主机,将本地日志远程发送至集中日志服务器。
- 测试并验证集中日志系统的端到端工作流程。
2. 核心概念
2.1 传统的 syslog
在 Linux 早期,所有日志服务都由 syslogd 守护进程处理。它根据 /etc/syslog.conf 配置文件中的规则,将来自不同设施(facility,如 auth、mail、kern)和不同严重性(severity,如 emerg、alert、crit)的日志消息,分类写入到指定的日志文件(如 /var/log/messages)中。
局限性:
- 功能较弱,配置语法简单。
- 不支持复杂的日志处理和转发。
- 性能在高负载下成为瓶颈。
- 不支持TLS加密传输。
2.2 rsyslog:syslog 的增强版
rsyslog(Rocket-fast SYSLOG)是现代 Linux 发行版的标准日志处理程序,它完全兼容传统 syslog,并带来了巨大改进:
- 模块化:功能通过动态加载的模块实现(如
imtcp,omfwd)。 - 高性能:使用多线程和队列系统处理海量日志。
- 可靠性:支持磁盘辅助队列,确保在网络中断时日志不丢失。
- 灵活性:强大的过滤、模板和输出插件。
- 安全性:支持 TLS 加密。
2.3 集中日志服务器
这是本课的核心。想象一下,你管理着 100 台服务器,如果要查看每台机器的 /var/log/messages,你需要登录 100 次。集中日志服务器可以解决这个问题:
- 服务器 (Server/Collector):一台专门的机器,运行
rsyslog并监听网络端口,接收来自所有客户端的日志。 - 客户端 (Client/Sender):你的应用服务器、数据库服务器等,配置它们将日志转发给中央服务器。
- 优势:集中查看所有日志、统一安全审计、简化故障排查、日志更安全(集中存储和备份)。
rsyslog 的客户端-服务器通信协议:
- 传统 UDP:简单,但不可靠(丢包)。
- 现代 TCP:可靠,保证日志顺序和送达。
- RELP (Reliable Event Logging Protocol):最可靠,专为日志设计,但需要客户端也使用
rsyslog。
3. 代码示例
示例1:理解 rsyslog 基础配置
/etc/rsyslog.conf 是主配置文件。查看其结构,它通常包含模块加载、全局指令和规则。
# 查看配置文件
cat /etc/rsyslog.conf
# 一个典型的简单规则(兼容syslog格式):
# *.info;mail.none;authpriv.none;cron.none /var/log/messages
# 含义:将所有info级别及以上,但排除mail、authpriv、facility的日志,写入messages文件。
示例2:配置 rsyslog 作为集中日志服务器
假设我们要将服务器 logserver.example.com 配置为日志收集器。
步骤 1:启用 TCP 监听模块
# 编辑配置文件,通常在 /etc/rsyslog.conf 中取消注释或添加以下行:
sudo vim /etc/rsyslog.conf
在文件顶部找到模块加载区域,确保以下两行存在(去掉注释):
# Provides TCP syslog reception
module(load="imtcp") # 加载TCP输入模块
input(type="imtcp" port="514") # 在514端口监听
步骤 2:创建接收日志的规则和模板 在配置文件末尾添加以下内容,用于按客户端IP地址和日期存储日志:
# 定义一个模板,用于保存日志文件的路径格式
template(name="RemoteHostLog" type="string"
string="/var/log/remote/%FROMHOST-IP%/%$YEAR%-%$MONTH%-%$DAY%.log")
# 定义一个动作规则:所有来自远程的日志(通过TCP),都应用上面的模板存储
if $inputname == 'imtcp' then {
action(type="omfile" dynaFile="RemoteHostLog")
stop
}
解释:%FROMHOST-IP% 是一个rsyslog内置变量,会自动替换为发送日志的客户端IP地址。这样,来自 192.168.1.10 的日志会存放在 /var/log/remote/192.168.1.10/ 目录下。
步骤 3:创建存储目录并重启服务
# 创建远程日志存储目录
sudo mkdir -p /var/log/remote
# 确保 rsyslog 用户对该目录有写入权限(通常为 `syslog` 用户)
sudo chown syslog:syslog /var/log/remote
# 重启 rsyslog 服务以应用配置
sudo systemctl restart rsyslog
# 检查端口是否监听
sudo ss -tlnp | grep 514
# 应该看到类似:LISTEN 0 10 0.0.0.0:514 0.0.0.0:* users:(("rsyslogd",...))
示例3:配置客户端将日志发送到集中服务器
假设我们有一台应用服务器 app01.example.com,需要将它的日志发送到 logserver.example.com。
# 在 app01 上编辑配置
sudo vim /etc/rsyslog.conf
# 在文件末尾添加以下一行,指定转发规则
# 将所有日志(除本地标记外)通过TCP发送到日志服务器的514端口
*.* action(type="omfwd"
target="logserver.example.com"
port="514"
protocol="tcp"
template="RSYSLOG_SyslogProtocol23Format" # 使用标准的RFC 5424格式,兼容性好
queue.type="LinkedList" # 使用链表队列,内存缓冲
action.resumeRetryCount="-1" # 无限重试
queue.filename="fwdQueue1" # 队列持久化文件名(用于故障恢复)
queue.maxdiskspace="1g" # 队列最大磁盘空间
queue.saveonshutdown="on" # 关闭时保存队列
action.resumeInterval="5" # 重试间隔(秒)
)
# 重启客户端上的 rsyslog
sudo systemctl restart rsyslog
验证:现在在 app01 上生成一条日志,在 logserver 上应该能看到它。
# 在 app01 上生成一条测试日志
logger -p user.info "Test message from app01 for centralized logging"
# 在 logserver 上检查对应的IP目录
ls /var/log/remote/192.168.1.10/ # 假设app01的IP是192.168.1.10
cat /var/log/remote/192.168.1.10/2024-07-22.log
4. 实践练习
练习 1:基础配置
要求:在你的本地机器(或虚拟机)上,修改 rsyslog 配置,将所有 mail 设施的日志(任何级别)单独写入 /var/log/mail_only.log。
预期输出:执行 logger -p mail.info "Test mail log" 后,能在 /var/log/mail_only.log 中看到该消息。
练习 2:搭建集中日志服务器
要求:使用两台虚拟机(或在同一台机器上使用不同端口模拟),将一台配置为日志服务器(监听 TCP 514),另一台配置为客户端,将其 auth 设施的日志转发到服务器。
预期输出:在客户端执行 logger -p auth.info "Admin login attempt",在服务器端能查看到来自该客户端的认证日志。
练习 3:高级过滤与转发
要求:在集中日志服务器上,除了按客户端IP存储所有日志外,额外创建一个规则:将所有严重性级别为 error 或 crit 的日志,无论来自哪个客户端,都复制一份到 /var/log/remote-critical.log 文件。
提示:需要在服务器配置文件中添加一条基于日志内容(severity)的过滤规则。
5. 常见错误
- 配置文件语法错误:
rsyslog.conf对语法敏感。修改后使用rsyslogd -N1或rsyslogd -dn进行语法检查和调试,不要直接重启服务。 - 权限问题:rsyslog 守护进程通常以
syslog用户运行,它需要对日志目录和文件有写入权限。使用chown和chmod修正。 - 防火墙阻塞:确保服务器防火墙允许客户端连接的端口(如 TCP 514)。使用
firewall-cmd或iptables开放端口。 - SELinux 阻止:如果启用了 SELinux,它可能会阻止 rsyslog 监听非标准端口或写入特定目录。可以使用
setsebool -P syslogd_tcp_bind_unreserved_ports on或使用chcon设置正确的上下文。 - 模板路径错误:在定义动态文件名模板(
dynaFile)时,确保路径中的变量(如%FROMHOST-IP%)拼写正确,且父目录已存在。
6. 小结
- 传统 syslog 是基础,但功能有限;rsyslog 是其现代化、高性能、模块化的替代品。
- 集中日志是大规模系统运维的核心实践,它通过 客户端-服务器 模式实现。
- 配置集中日志的关键在于:
- 在 服务器 上加载
imtcp模块并监听端口。 - 使用 模板 (
template) 灵活定义日志存储路径。 - 在 客户端 使用
action指令配合omfwd模块转发日志。
- 在 服务器 上加载
- 始终使用
rsyslogd -N1验证配置,并关注 防火墙 和 SELinux 设置。 - 可靠传输建议使用 TCP 或 RELP 协议,并配置客户端队列以应对网络抖动。
掌握 rsyslog 集中日志,为你构建可观测性系统打下坚实的基础。下一课,我们将深入到更底层的 内核参数调优,探索如何通过 sysctl 优化系统性能。