在Linux服务器集群环境中,每台服务器都会产生大量系统日志,分散存储的日志不仅会增加排查故障的时间成本,还容易出现日志丢失的问题,设置系统日志集中管理可以有效解决这些痛点,实现所有节点日志的统一归集与管控。
集中管理的核心原理
Linux系统日志集中管理的核心是通过日志客户端和服务端的配合实现数据传输,常见的工作流程如下:
- 客户端采集本地的系统日志,包括内核日志、服务日志、用户操作日志等
- 客户端按照配置的规则将日志通过网络协议发送到指定的日志服务端
- 服务端接收来自各个客户端的日志,按照规则分类存储、归档
- 运维人员通过服务端的日志分析工具统一查询、检索所需日志
常用工具介绍
rsyslog
rsyslog是Linux系统默认的日志服务工具,支持多种日志传输协议,兼容传统syslog协议,同时具备高性能、模块化扩展的特点,是搭建集中日志管理最常用的工具。
systemd-journald
systemd-journald是systemd套件自带的日志管理组件,负责收集内核、系统服务、用户进程的日志,默认以二进制格式存储,支持结构化查询,也可以和rsyslog配合实现日志转发。
logrotate
logrotate是日志轮转工具,可以自动对日志文件进行切割、压缩、删除旧日志,避免日志占满磁盘空间,是日志管理体系中不可或缺的组成部分。
服务端配置步骤
首先在服务端服务器安装rsyslog,大部分Linux发行版默认已经安装,若未安装可以通过包管理器安装:
# CentOS/RHEL系统安装命令 yum install rsyslog -y # Ubuntu/Debian系统安装命令 apt install rsyslog -y
安装完成后编辑rsyslog配置文件/etc/rsyslog.conf,开启UDP和TCP接收端口:
# 备份原始配置文件 cp /etc/rsyslog.conf /etc/rsyslog.conf.bak # 编辑配置文件,取消以下两行的注释,开启514端口的UDP和TCP监听 # 若文件中没有这两行,可以手动添加 module(load="imudp") # 加载UDP接收模块 input(type="imudp" port="514") # 监听514端口UDP请求 module(load="imtcp") # 加载TCP接收模块 input(type="imtcp" port="514") # 监听514端口TCP请求
接着添加日志存储规则,在/etc/rsyslog.d/目录下新建集中日志配置文件central.conf:
# 创建日志存储目录,按客户端IP分类存储日志 $FileCreateMode 0644 # 日志文件权限 $DirCreateMode 0755 # 日志目录权限 $FileOwner root # 日志文件所有者 $FileGroup root # 日志文件所属组 # 所有接收到的日志按客户端IP存储到对应目录,文件名为当前日期 template(name="RemoteLogs" type="string" string="/var/log/remote/%FROMHOST-IP%/%$NOW%.log") *.* ?RemoteLogs # 所有日志类型都使用该模板存储 & ~ # 停止后续的日志处理,避免重复存储
配置完成后重启rsyslog服务并设置开机自启:
systemctl restart rsyslog systemctl enable rsyslog # 检查服务状态,确保服务正常运行 systemctl status rsyslog
同时需要开放服务端防火墙的514端口,允许客户端发送日志:
# firewalld防火墙开放端口 firewall-cmd --add-port=514/udp --permanent firewall-cmd --add-port=514/tcp --permanent firewall-cmd --reload # iptables防火墙开放端口 iptables -A INPUT -p udp --dport 514 -j ACCEPT iptables -A INPUT -p tcp --dport 514 -j ACCEPT service iptables save
客户端配置步骤
客户端同样需要安装rsyslog服务,安装完成后编辑/etc/rsyslog.conf配置文件,添加日志发送规则:
# 在配置文件末尾添加以下内容,将日志发送到服务端的514端口 # 可以根据需要选择UDP或者TCP协议,TCP更可靠,UDP传输效率更高 # 替换为实际的服务端IP地址 *.* @@192.168.0.100:514 # 两个@代表使用TCP协议发送 # 若使用UDP协议,使用一个@即可 # *.* @192.168.0.100:514
如果需要同时转发systemd-journald的日志,还需要编辑/etc/systemd/journald.conf文件,设置转发规则:
# 将ForwardToSyslog设置为yes,开启日志转发到rsyslog ForwardToSyslog=yes
配置完成后重启rsyslog和journald服务:
systemctl restart rsyslog systemctl restart systemd-journald
日志轮转配置
为了避免集中存储的日志占满磁盘,需要配置logrotate对远程日志进行轮转,在/etc/logrotate.d/目录下新建remote-logs配置文件:
/var/log/remote/*/*.log {
daily # 每天轮转一次
rotate 30 # 保留30天的日志
compress # 压缩旧日志
delaycompress # 延迟压缩,最近一次轮转的日志不压缩
missingok # 日志文件不存在时不报错
notifempty # 日志为空时不轮转
create 0644 root root # 新建日志文件的权限和所有者
sharedscripts # 所有日志轮转完成后执行一次脚本
postrotate
/bin/systemctl restart rsyslog > /dev/null 2>&1 || true
endscript
}
验证配置效果
在客户端执行日志生成命令,测试日志是否能正常发送到服务端:
# 生成一条测试日志 logger "this is a test log for centralized log management"
在服务端查看对应的日志存储目录,确认是否存在对应的日志文件,以及文件内是否包含刚才发送的测试日志:
# 查看客户端IP对应的日志目录,替换为实际客户端IP ls /var/log/remote/192.168.0.101/ # 查看当日日志内容 cat /var/log/remote/192.168.0.101/$(date +%Y-%m-%d).log | grep "test log"
常见问题排查
- 若客户端日志无法发送到服务端,首先检查服务端514端口是否正常监听,使用
ss -tulnp | grep 514命令查看端口状态 - 检查防火墙规则是否生效,是否存在端口拦截的情况
- 查看rsyslog服务日志
/var/log/messages或者journalctl -u rsyslog,排查配置错误或者服务异常 - 确认客户端配置的服务端IP和端口是否正确,协议是否匹配
rsysloglogrotatesystemd_journalsyslog_server修改时间:2026-06-22 09:04:05