Syslog 是一种标准的日志记录系统,几乎所有的 Linux/Unix 系统都使用它,它的工作核心是 客户端-服务器 架构,也称为 集中式日志管理。

核心概念
在开始配置之前,需要理解 syslog 的几个核心组件:
- Syslog 协议:一个简单的文本协议,用于在 IP 网络上传输日志消息,它定义了消息的格式。
- Syslog 守护进程:在后台运行的服务程序,负责接收、处理和存储日志消息。
- 传统实现:
sysklogd或syslog-ng。 - 现代实现 (推荐):
rsyslog,现在绝大多数 Linux 发行版(如 RHEL/CentOS, Ubuntu/Debian)都默认使用rsyslog,它功能强大、性能高、配置灵活。
- 传统实现:
- 日志来源:
- 本地:系统内核、应用程序(如
sshd,nginx)等。 - 远程:网络中的其他服务器、网络设备(如路由器、交换机)。
- 本地:系统内核、应用程序(如
- 日志消息格式:通常遵循 RFC 3164 或 RFC 5424 标准,一个典型的日志条目包含:
- 优先级:由 设施 和 严重级别 组成。
- 时间戳:消息产生的时间。
- 主机名:产生消息的主机名。
- :实际的日志信息。
Syslog 的 Facility 和 Severity
这是配置 syslog 的关键,通过组合 Facility 和 Severity,你可以精确地控制哪些日志应该被记录、记录到哪里。
Facility (设施)
定义了日志消息的来源类别。
| Facility | 数字 | 描述 |
|---|---|---|
kern |
0 | 内核消息 |
user |
1 | 用户进程 |
mail |
2 | 邮件系统 |
daemon |
3 | 系统守护进程 |
auth |
4 | 安全/认证相关 (如 login, sudo) |
syslog |
5 | syslogd 守护进程本身 |
lpr |
6 | 打印系统 |
news |
7 | 网络新闻系统 (NNTP) |
uucp |
8 | UUCP 系统 |
cron |
9 | 计划任务 (cron) |
authpriv |
10 | 安全/认证相关 (与 auth 类似,但日志权限更私有) |
ftp |
11 | FTP 守护进程 |
local0 |
16 | 本地使用 (自定义应用常用) |
local1 - local7 |
17-23 | 本地使用 (自定义应用常用) |
Severity (严重级别)
定义了消息的紧急程度,数字越小越严重。

| Severity | 数字 | 描述 |
|---|---|---|
emerg |
0 | 系统不可用 (紧急) |
alert |
1 | 需要立即行动的警报 |
crit |
2 | 严重情况 |
err |
3 | 错误 |
warning |
4 | 警告 |
notice |
5 | 重要通知 |
info |
6 | 一般信息 |
debug |
7 | 调试信息 |
组合示例:
*.info:记录所有设施()的info级别及以上的日志。mail.*:记录mail设施的所有级别的日志。authpriv.none:不记录authpriv设施的任何日志。local0.*:记录所有自定义应用(使用local0设施)的日志。
配置 Syslog 服务器 (以 Rsyslog 为例)
我们将配置一台服务器(logserver.example.com)作为中央日志服务器,接收其他客户端的日志。
场景1:仅作为日志服务器,不记录本地日志
-
安装 Rsyslog
# CentOS / RHEL / Fedora sudo yum install rsyslog # Ubuntu / Debian sudo apt-get install rsyslog
-
编辑 Rsyslog 配置文件 主配置文件通常是
/etc/rsyslog.conf,为了管理方便,建议为远程日志创建一个单独的配置文件,/etc/rsyslog.d/50-remote.conf。
(图片来源网络,侵删)sudo nano /etc/rsyslog.d/50-remote.conf
-
添加配置规则 在文件中添加以下内容,这行配置的含义是:接收所有来自远程客户端的 级别的日志,并将其追加到
/var/log/remotehosts.log文件中。# UDP is less reliable but faster. TCP is recommended for production. # $ModLoad imudp # $UDPServerRun 514 # TCP is more reliable. Recommended for production. $ModLoad imtcp $InputTCPServerRun 514 # 接收所有远程日志并存入指定文件 # ?RemoteHost 是一个模板宏,会自动在日志中记录发送日志的客户端IP或主机名 *.* ?RemoteHost
$ModLoad imtcp:加载 TCP 输入模块,用于监听网络连接。$InputTCPServerRun 514:在 TCP 端口 514 上启动监听。注意:确保防火墙允许此端口。*.* ?RemoteHost:这是核心规则。- 表示接收所有设施和所有严重级别的日志。
?RemoteHost是一个特殊的 "动态文件名",Rsyslog 会为每个客户端创建一个以客户端IP地址或主机名命名的日志文件,并存放在/var/log/hosts/目录下,这是一种更灵活的组织方式。- 如果你希望所有客户端的日志都写入一个文件,可以使用
*.* /var/log/remotehosts.log。
-
创建日志目录并设置权限 Rsyslog 通常会以
root身份运行,但它写入的文件/目录权限可能不正确,为了安全,建议以非特权用户身份运行。# 创建一个专门用于运行 rsyslog 的用户 sudo useradd -r -s /bin/false rsyslog # 创建日志目录 sudo mkdir -p /var/log/hosts # 设置正确的所有权和权限 sudo chown -R rsyslog:rsyslog /var/log/hosts sudo chmod 750 /var/log/hosts
-
重启并启用 Rsyslog 服务
sudo systemctl restart rsyslog sudo systemctl enable rsyslog
-
配置防火墙 允许 TCP 端口 514 的入站流量。
# 使用 firewalld (CentOS/RHEL 7+) sudo firewall-cmd --permanent --add-port=514/tcp sudo firewall-cmd --reload # 使用 ufw (Ubuntu/Debian) sudo ufw allow 514/tcp
你的日志服务器已经准备就绪。
配置 Syslog 客户端
假设客户端主机名为 webserver01.example.com。
-
确保 Rsyslog 已安装 客户端也需要安装
rsyslog,但它作为发送方,不需要复杂的配置。 -
编辑 Rsyslog 客户端配置文件 同样,建议创建一个单独的配置文件,
/etc/rsyslog.d/50-forward.conf。sudo nano /etc/rsyslog.d/50-forward.conf
-
添加配置规则 在文件中添加以下内容,将特定或所有日志发送到日志服务器。
# 将所有本地日志发送到远程日志服务器 *.* @<日志服务器IP地址>:514 # 或者,如果你想发送特定设施,例如只发送认证日志和自定义应用日志 # authpriv.*,local0.* @<日志服务器IP地址>:514 # 使用 '@' 表示 UDP (不可靠但快) # 使用 '@@' 表示 TCP (可靠
