什么是 Syslog?
Syslog 是一种标准的日志记录协议,广泛应用于 Unix、Linux 和网络设备中,它允许将系统日志、应用程序日志等发送到中央服务器进行集中管理、存储和分析。

核心思想:
- 客户端: 运行各种服务和应用程序的 Linux 服务器、路由器、交换机、防火墙等。
- 服务器: 一台专门的中央日志服务器,负责接收、存储和处理来自所有客户端的日志。
为什么需要 Syslog 服务器?
- 集中管理: 无需登录每台服务器去查看日志,在中央服务器上就能掌握所有系统的运行状态。
- 安全性: 日志可以集中存储在安全的地方,防止攻击者在入侵客户端后删除日志痕迹。
- 故障排查: 当问题发生时,可以快速关联不同服务器在同一时间点的日志,定位问题根源。
- 审计与合规: 满足安全审计要求,记录所有关键操作和系统事件。
- 性能分析: 通过分析日志,了解系统负载、应用性能等。
Syslog 的工作原理
Syslog 协议非常简单,通常基于 UDP 协议(端口 514)进行通信,因为它开销小、速度快,但对于高可靠性要求的场景,也可以使用 TCP(端口 514)。
一条 Syslog 日志消息通常包含三个部分:

- PRI (Priority): 由“设施”和“严重级别”组成,用于标识日志的重要性和来源。
- HEADER: 包含时间戳、主机名、进程名和 PID(进程 ID)。
- MSG: 实际的日志消息内容。
设施
设施指明了日志消息的来源,
auth或authpriv: 认证相关的安全信息(如登录)。cron: 定时任务cron的日志。daemon: 系统守护进程的日志。kern: 内核消息。lpr: 打印系统。mail: 邮件系统。user: 用户进程。uucp: UUCP 系统。local0~local7: 留给本地用户自定义使用。
严重级别
级别从低到高,表示紧急程度:
0:emerg(Emergency): 系统不可用。1:alert(Alert): 必须立即采取行动。2:crit(Critical): 严重情况。3:err(Error): 错误。4:warn(Warning): 警告。5:notice(Notice): 普通但重要的事件。6:info(Information): 一般信息。7:debug(Debug): 调试信息。
示例:
一条来自 mail 设施、级别为 err 的日志,其 PRI 值就是 3 * 8 + 14 = 38(设施代码为 14,级别代码为 3)。
如何搭建 Syslog 服务器
在 Linux 中,最常用的 Syslog 服务器软件是 Rsyslog,它功能强大、性能优越,并且是现代大多数 Linux 发行版(如 CentOS, RHEL, Ubuntu, Debian)的默认日志系统。

场景规划
- 服务器:
168.1.100(我们将在这台机器上安装 Rsyslog 服务器) - 客户端:
168.1.101(我们将配置这台机器将日志发送到服务器)
在服务器端配置 (192.168.1.100)
-
安装 Rsyslog Rsyslog 通常已经预装,如果没有,可以使用以下命令安装:
# For CentOS/RHEL/Fedora sudo yum install -y rsyslog # For Debian/Ubuntu sudo apt-get update sudo apt-get install -y rsyslog
-
编辑主配置文件 打开
/etc/rsyslog.conf文件,我们需要做两件事:- 启用 UDP/TCP 监听。
- 设置接收到的日志的存储规则。
sudo vim /etc/rsyslog.conf
在文件中找到并修改以下部分:
a. 启用网络监听 取消注释以下行,以监听来自网络的 UDP 和 TCP 消息。 代表接受所有 Facility 的日志。
# Provides UDP syslog reception module(load="imudp") # needs to be done just once input(type="imudp" port="514") # Provides TCP syslog reception module(load="imtcp") # needs to be done just once input(type="imtcp" port="514")
b. 配置日志存储规则 在文件末尾添加新的规则,用于处理来自客户端的日志,这是一个推荐的配置,可以按客户端 IP 和日期进行归档,便于管理。
# Rule for receiving logs from remote clients # This template formats the log as: IP, Hostname, Facility, Priority, Message # This template formats the log as: IP, Hostname, Facility, Priority, Message $template RemoteLogs,"/var/log/clients/%FROMHOSTIP%/%FROMHOSTIP%-%$YEAR%-%$MONTH%-%$DAY%.log" # This rule will receive all logs from remote hosts and apply the template *.* ?RemoteLogs
规则解释:
$template RemoteLogs, ...: 定义一个名为RemoteLogs的模板。/var/log/clients/%FROMHOSTIP%/%FROMHOSTIP%-%$YEAR%-%$MONTH%-%$DAY%.log: 这是日志文件的存储路径。%FROMHOSTIP%: 自动替换为发送日志的客户端 IP 地址。%$YEAR%,%$MONTH%,%$DAY%: 自动替换为年、月、日。- 这样,每台客户端的日志都会存放在
/var/log/clients/<客户端IP>/目录下,并按天分割文件,结构清晰。
*.* ?RemoteLogs: 这是一个全局规则。- 表示接收所有 Facility 和所有 Priority 的日志。
?RemoteLogs表示将匹配的日志使用RemoteLogs模板写入文件。
-
创建日志目录并设置权限 Rsyslog 不会自动创建目录,需要手动创建并赋予正确的权限。
sudo mkdir -p /var/log/clients sudo chmod 755 /var/log/clients # rsyslog 默认以 root 运行,创建的文件会属于 root,所以目录权限 755 即可
-
启动并启用 Rsyslog 服务
sudo systemctl restart rsyslog sudo systemctl enable rsyslog
-
检查状态和防火墙 确保 Rsyslog 正在运行,并且防火墙允许 514 端口的流量。
sudo systemctl status rsyslog # For firewalld (CentOS/RHEL) sudo firewall-cmd --permanent --add-port=514/udp sudo firewall-cmd --permanent --add-port=514/tcp sudo firewall-cmd --reload # For ufw (Ubuntu/Debian) sudo ufw allow 514/udp sudo ufw allow 514/tcp
你的 Syslog 服务器已经准备就绪!
在客户端配置 (192.168.1.101)
-
安装 Rsyslog 和服务器端一样,确保客户端也安装了
rsyslog。 -
编辑客户端配置文件 打开
/etc/rsyslog.conf或/etc/rsyslog.d/50-default.conf。sudo vim /etc/rsyslog.conf
我们需要添加一行,将日志发送到服务器,我们会将本地日志和发送到服务器的日志都保留。
# Standard Log Formats # ... (保留默认的本地日志规则) ... # Rule to send all logs to the central syslog server *.* @192.168.1.100
符号说明:
- 使用 UDP 协议发送(速度快,可能丢包)。
- 使用 TCP 协议发送(可靠,无丢包,但速度稍慢)。
最佳实践: 你可以只发送特定级别的日志(
warning及以上)到服务器,以减少网络流量和服务器存储压力。# Send logs of priority 'warning' and higher to the server *.warning;authpriv.none;mail.none @192.168.1.100
这个规则表示:除了
authpriv和mail的日志,其他所有 Facility 的warning级别及以上的日志都发送到服务器。 -
启动并启用 Rsyslog 服务
sudo systemctl restart rsyslog sudo systemctl enable rsyslog
验证配置
-
在客户端上生成一条日志
# 生成一个认证日志 logger "This is a test message from client 101"
-
在服务器上检查日志 稍等几秒钟,然后到服务器上查看日志文件是否已创建并写入。
# 查看目录结构 ls -l /var/log/clients/ # 查看今天的日志文件 ls -l /var/log/clients/192.168.1.101/ # 查看日志内容 cat /var/log/clients/192.168.1.101/192.168.1.101-$(date +%Y-%m-%d).log
你应该能看到类似下面内容的日志:
Oct 27 10:30:01 192.168.1.101 root: This is a test message from client 101这里的
168.1.101是客户端主机名(或 IP),root是发送日志的用户。
高级功能与扩展
使用 TLS 加密日志传输
为了防止日志在传输过程中被窃听或篡改,可以使用 TLS (SSL) 对通信进行加密,这需要在 Rsyslog 服务器上配置证书和私钥,并在客户端配置使用 gtls (GnuTLS) 驱动。
日志过滤
Rsyslog 支持强大的过滤功能,可以根据 Facility、Priority、消息内容、正则表达式等对日志进行复杂的处理,
- 只记录包含 "error" 关键字的日志。
- 忽略来自某个特定进程的日志。
日志转发
Rsyslog 可以级联,A 服务器可以接收 B、C、D 的日志,然后再将所有日志转发到更高级别的中央日志服务器 E。
日志分析与可视化
收集到日志只是第一步,更重要的是分析和利用它们,常用的工具有:
- ELK Stack (Elasticsearch, Logstash, Kibana): 功能强大,适合大规模日志分析、搜索和可视化。
- Graylog: 专业的日志管理平台,功能丰富,开箱即用。
- Loki (by Grafana): 轻量级日志聚合系统,与 Prometheus 和 Grafana 生态无缝集成。
搭建一个 Syslog 服务器是系统管理员的基础技能,通过使用 Rsyslog,你可以轻松实现日志的集中化管理,极大地提升运维效率和问题排查能力,核心步骤如下:
- 服务器端: 安装 Rsyslog,配置
imudp/imtcp模块监听网络,并使用$template定义日志存储格式和路径。 - 客户端: 安装 Rsyslog,配置 或 将日志发送到服务器 IP。
- 验证: 在客户端生成日志,在服务器端检查是否收到。
- 安全与扩展: 考虑使用防火墙、TLS 加密以及更高级的分析工具来完善你的日志系统。
