87·系统监控与调优高级

syslog 与 rsyslog 集中日志

syslogrsyslog

第 87 课 - syslog 与 rsyslog 集中日志

所属模块:系统监控与调优

难度:Advanced
标签syslog, rsyslog, 集中日志, 日志服务器
先修知识:第 86 课 - 日志管理与 logrotate

1. 学习目标

完成本课学习后,你将能够:

  • 理解传统 syslog 服务的架构及其局限性。
  • 掌握现代 rsyslog 的增强特性与模块化配置。
  • 配置一台 rsyslog 服务器,用于接收来自网络内其他主机(客户端)的日志。
  • 配置客户端主机,将本地日志远程发送至集中日志服务器。
  • 测试并验证集中日志系统的端到端工作流程。

2. 核心概念

2.1 传统的 syslog

在 Linux 早期,所有日志服务都由 syslogd 守护进程处理。它根据 /etc/syslog.conf 配置文件中的规则,将来自不同设施(facility,如 authmailkern)和不同严重性(severity,如 emergalertcrit)的日志消息,分类写入到指定的日志文件(如 /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存储所有日志外,额外创建一个规则:将所有严重性级别为 errorcrit 的日志,无论来自哪个客户端,都复制一份到 /var/log/remote-critical.log 文件。 提示:需要在服务器配置文件中添加一条基于日志内容(severity)的过滤规则。

5. 常见错误

  1. 配置文件语法错误rsyslog.conf 对语法敏感。修改后使用 rsyslogd -N1rsyslogd -dn 进行语法检查和调试,不要直接重启服务。
  2. 权限问题:rsyslog 守护进程通常以 syslog 用户运行,它需要对日志目录和文件有写入权限。使用 chownchmod 修正。
  3. 防火墙阻塞:确保服务器防火墙允许客户端连接的端口(如 TCP 514)。使用 firewall-cmdiptables 开放端口。
  4. SELinux 阻止:如果启用了 SELinux,它可能会阻止 rsyslog 监听非标准端口或写入特定目录。可以使用 setsebool -P syslogd_tcp_bind_unreserved_ports on 或使用 chcon 设置正确的上下文。
  5. 模板路径错误:在定义动态文件名模板(dynaFile)时,确保路径中的变量(如 %FROMHOST-IP%)拼写正确,且父目录已存在。

6. 小结

  • 传统 syslog 是基础,但功能有限;rsyslog 是其现代化、高性能、模块化的替代品。
  • 集中日志是大规模系统运维的核心实践,它通过 客户端-服务器 模式实现。
  • 配置集中日志的关键在于:
    1. 服务器 上加载 imtcp 模块并监听端口。
    2. 使用 模板 (template) 灵活定义日志存储路径。
    3. 客户端 使用 action 指令配合 omfwd 模块转发日志。
  • 始终使用 rsyslogd -N1 验证配置,并关注 防火墙SELinux 设置。
  • 可靠传输建议使用 TCPRELP 协议,并配置客户端队列以应对网络抖动。

掌握 rsyslog 集中日志,为你构建可观测性系统打下坚实的基础。下一课,我们将深入到更底层的 内核参数调优,探索如何通过 sysctl 优化系统性能。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「内核参数调优 sysctl」 以巩固所学知识。