使用 rsyslog 配置一个服务器接收日志(Server)、另一个服务器发送日志(Client)的详细步骤:
架构说明
- 日志接收服务器(Server):负责集中存储来自其他服务器的日志。
- 日志发送服务器(Client):将本地日志转发到接收服务器。
一、日志接收服务器(Server)配置
1. 修改 rsyslog 配置文件
编辑 /etc/rsyslog.conf,启用远程日志接收功能:
sudo vim /etc/rsyslog.conf
2. 启用 UDP/TCP 协议接收
取消注释或添加以下配置(选择一种协议或同时启用两者):
- UDP 接收(速度快,无连接):
# 启用 UDP 模块 module(load="imudp") input(type="imudp" port="514") # 定义日志存储路径模板(按客户端IP分类) $template RemoteLogs, "/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log" *.* ?RemoteLogs - TCP 接收(可靠,有连接):
# 启用 TCP 模块 module(load="imtcp") input(type="imtcp" port="514") # 定义日志存储路径模板(按客户端IP分类) $template RemoteLogs, "/var/log/remote/%FROMHOST-IP%/%PROGRAMNAME%.log" *.* ?RemoteLogs
3. 创建日志存储目录
sudo mkdir -p /var/log/remote
sudo chown -R syslog:syslog /var/log/remote
# 报错时
sudo groupadd syslog
sudo useradd -g syslog syslog
4. 重启 rsyslog 服务
sudo systemctl restart rsyslog
5. 验证端口监听
检查是否已监听 514 端口:
sudo netstat -tuln | grep 514
# 应看到如下输出(UDP/TCP):
# udp 0 0 0.0.0.0:514 0.0.0.0:*
# tcp 0 0 0.0.0.0:514 0.0.0.0:*
二、日志发送服务器(Client)配置
1. 修改 rsyslog 配置文件
编辑 /etc/rsyslog.conf,添加转发规则:
sudo vim /etc/rsyslog.conf
2. 配置转发到接收服务器
在文件末尾添加以下规则(选择 UDP 或 TCP):
- 通过 UDP 发送:
*.* @server-ip:514 # @ 表示 UDP - 通过 TCP 发送:
*.* @@server-ip:514 # @@ 表示 TCP
3. 重启 rsyslog 服务
sudo systemctl restart rsyslog
三、验证日志传输
1. 在 Client 发送测试日志
# 生成一条测试日志
logger "This is a test message from Client"
2. 在 Server 检查日志
查看日志接收目录,按客户端 IP 分类的日志文件:
ls /var/log/remote/
# 输出示例:
# 192.168.1.100
# 查看具体日志文件
tail -f /var/log/remote/192.168.1.100/syslog.log
四、防火墙配置(可选)
如果服务器启用了防火墙,需放行 514 端口:
- Ubuntu (ufw):
sudo ufw allow 514/udp sudo ufw allow 514/tcp sudo ufw reload - CentOS (firewalld):
sudo firewall-cmd --permanent --add-port=514/udp sudo firewall-cmd --permanent --add-port=514/tcp sudo firewall-cmd --reload
五、高级配置(可选)
1. 加密传输(TLS)
若需安全传输,可配置 TLS 加密:
- 参考 rsyslog TLS 文档。
2. 过滤特定日志
仅转发特定日志(例如 auth 和 kernel 日志):
# 在 Client 的配置中添加:
auth.*,kern.* @@server-ip:514
3. 日志轮转
配置 logrotate 管理日志文件:
sudo vim /etc/logrotate.d/remote-logs
# 添加以下内容:
/var/log/remote/*/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
sharedscripts
postrotate
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
总结
- Server:启用 UDP/TCP 监听,定义日志存储模板。
- Client:配置转发规则到 Server。
- 验证:通过
logger命令和日志文件检查传输是否成功。
问题
当rsyslog无法将日志写入远程服务器时,可以按照以下步骤逐步排查和解决问题:
1. 检查rsyslog配置
确保客户端和服务器端的配置正确。
客户端配置
- 发送日志的语法:
- UDP:
*.* @remote-host:514(单个@) - TCP:
*.* @@remote-host:514(双@) - 示例:将所有日志通过TCP发送到远程服务器:
# 在 /etc/rsyslog.conf 或 /etc/rsyslog.d/*.conf 中添加 *.* @@192.168.1.100:514
- UDP:
服务器端配置
-
确保服务器端已启用接收远程日志:
# 取消注释或添加以下行(通常位于 /etc/rsyslog.conf) module(load="imudp") # 启用UDP input(type="imudp" port="514") module(load="imtcp") # 启用TCP input(type="imtcp" port="514") -
允许接收来自客户端的日志(可选):
# 限制允许的客户端IP(示例) $AllowedSender UDP, 192.168.1.0/24 $AllowedSender TCP, 192.168.1.0/24
2. 检查网络连通性
验证端口是否可达
- 从客户端测试远程服务器的端口:
telnet 192.168.1.100 514 # TCP nc -zv 192.168.1.100 514 # TCP/UDP
防火墙规则
-
客户端和服务器端的防火墙需放行514端口:
# 示例:使用firewalld(TCP) firewall-cmd --permanent --add-port=514/tcp firewall-cmd --reload # 或使用iptables(UDP) iptables -A INPUT -p udp --dport 514 -j ACCEPT -
云服务器安全组:确保云平台(如AWS、阿里云)的安全组允许514端口的入站流量。
3. 检查远程rsyslog服务状态
-
确保远程rsyslog服务正在运行:
systemctl status rsyslog # 查看服务状态 systemctl restart rsyslog # 重启服务 -
检查远程服务器是否在监听514端口:
netstat -tuln | grep 514 ss -tuln | grep 514
4. 检查SELinux/AppArmor
-
临时禁用SELinux(仅用于测试):
setenforce 0 -
永久允许rsyslog网络连接:
# SELinux setsebool -P rsyslog_network_connect 1 # AppArmor(编辑配置文件) vim /etc/apparmor.d/usr.sbin.rsyslogd # 确保包含:network inet stream,
5. 查看日志
客户端日志
- 检查客户端本地的rsyslog日志:
tail -f /var/log/syslog | grep rsyslog
服务器端日志
- 检查远程服务器是否收到日志:
tail -f /var/log/syslog # 默认日志路径可能因系统而异
6. 检查文件权限(服务器端)
- 确保远程服务器的日志目录有写入权限:
chmod 755 /var/log/ chown syslog:syslog /var/log/remote/ # 如果配置了自定义日志路径
7. 调试模式
启用rsyslog调试日志
-
修改rsyslog配置:
# 在 /etc/rsyslog.conf 中添加 $DebugLevel 2 # 调试级别(0-2) -
重启服务并查看日志:
systemctl restart rsyslog tail -f /var/log/syslog | grep rsyslog
8. 其他常见问题
- 协议不匹配:客户端使用TCP(
@@),但服务器端仅启用UDP。 - 主机名解析失败:在配置中使用IP地址代替主机名。
- rsyslog版本差异:旧版本可能需要使用
$ModLoad语法,新版本(如v8+)使用module()语法。
总结命令清单
# 客户端测试端口连通性
nc -zv 192.168.1.100 514
# 服务器端检查端口监听
netstat -tuln | grep 514
# 重启rsyslog服务
systemctl restart rsyslog
# 查看实时日志(客户端和服务端)
tail -f /var/log/syslog
通过以上步骤,可以定位并解决大多数rsyslog远程日志传输问题。
Logrotate日志轮转配置解释
以管理 /var/log/remote/ 目录下按客户端 IP 分类的日志文件为例:
配置示例
/var/log/remote/*/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
sharedscripts
postrotate
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
逐行解释
1. 定义日志文件路径
/var/log/remote/*/*.log
- 作用:匹配
/var/log/remote下所有子目录(客户端 IP)中的.log文件。 - 示例:
/var/log/remote/192.168.1.100/syslog.log
/var/log/remote/192.168.1.101/kernel.log
2. 轮转周期
daily
- 作用:每天轮转一次日志。
- 其他选项:
weekly:每周轮转。monthly:每月轮转。size 100M:日志文件达到 100MB 时轮转。
3. 容错处理
missingok
- 作用:如果日志文件不存在,跳过不报错。
4. 保留历史文件数
rotate 7
- 作用:保留最近 7 次轮转的日志文件(如
syslog.log.1.gz~syslog.log.7.gz),超出数量的旧文件会被删除。
5. 压缩日志
compress
- 作用:使用
gzip压缩旧日志文件,生成.gz文件(例如syslog.log.1.gz)。
6. 延迟压缩
delaycompress
- 作用:本次轮转的日志文件(如
syslog.log.1)不压缩,等到下次轮转时再压缩。 - 适用场景:避免某些程序(如 rsyslog)因文件突然被删除而丢失日志。
7. 空文件不轮转
notifempty
- 作用:如果日志文件为空,则不执行轮转。
8. 共享脚本
sharedscripts
- 作用:无论匹配到多少个日志文件,
postrotate脚本只运行一次(默认对每个文件单独运行)。
9. 轮转后执行命令
postrotate
systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
- 作用:轮转完成后,通知 rsyslog 重新打开日志文件句柄,确保日志继续写入新文件。
- 关键点:
systemctl reload rsyslog:平滑重启 rsyslog,避免服务中断。> /dev/null 2>&1:屏蔽命令的输出。|| true:防止脚本因命令失败而终止。
轮转流程示例
假设日志文件 /var/log/remote/192.168.1.100/syslog.log 每天轮转一次:
- 第 1 天:
- 原始文件:
syslog.log - 轮转后:
syslog.log.1(未压缩,因delaycompress)- 新日志继续写入
syslog.log
- 原始文件:
- 第 2 天:
- 轮转后:
syslog.log.1→ 压缩为syslog.log.1.gzsyslog.log.2(未压缩)
- 轮转后:
- 第 8 天:
- 最旧的
syslog.log.7.gz被删除(因rotate 7)。
- 最旧的
验证配置
1. 手动触发轮转
logrotate -vf /etc/logrotate.d/remote-logs
-v:显示详细过程。-f:强制立即轮转。
2. 查看轮转结果
ls /var/log/remote/192.168.1.100/
# 输出示例:
# syslog.log syslog.log.1.gz syslog.log.2.gz
常见问题
1. 日志权限问题
- 确保
/var/log/remote/目录权限为syslog:syslog:chown -R syslog:syslog /var/log/remote
2. 自定义压缩工具
若需使用 xz 替代 gzip:
compresscmd /usr/bin/xz
compressoptions -9
3. 按日期命名日志
在配置中添加:
dateext
dateformat -%Y%m%d
- 轮转后的文件名为
syslog.log-20231001.gz。
总结
- 核心配置:定义日志路径、轮转周期、保留数量、压缩策略。
- 关键脚本:通过
postrotate通知服务重新加载,避免日志丢失。 - 调试命令:
logrotate -vf可快速验证配置。