CentOS如何正确配置rsyslog实现软件接入?
最近公司服务器迁移,新买的几台CentOS 8机器需要统一日志管理,领导让我搞定rsyslog的配置,说实话,之前我只在Ubuntu上玩过syslog-ng,对rsyslog的印象还停留在“CentOS默认日志工具”这个层面,但经过三天实战,从安装到高级配置,再到故障排查,现在总算能拍着胸脯说:“这活我熟!”今天就把整个过程掰开了揉碎了讲,保证让新手也能跟着操作,老手也能找到优化灵感。
为什么选rsyslog?它到底强在哪?
先说个真实案例:上周运维部小王用rsyslog把20台服务器的日志集中到一台日志服务器,结果发现某台Web服务器的Nginx访问日志里混着MySQL的错误日志,一问才知道,他直接用了默认配置,所有日志都往/var/log/messages
里灌,这就是不配置rsyslog的典型后果——日志混乱,排查问题像大海捞针。

rsyslog的优势其实很明显:
- 跨平台支持:Linux/Unix/Windows都能用,尤其适合混合环境
- 高性能:官方测试显示,单线程处理每秒10万条日志不丢包
- 灵活过滤:支持按设施(facility)、优先级(priority)、内容匹配过滤
- 多输出方式:文件、数据库、远程服务器、甚至邮件都能发
我司最终选择rsyslog,就是因为它的“集中日志+实时告警”能力——比如把所有authpriv
日志(认证相关)单独存到/var/log/secure
,同时把err
级别以上的日志实时推送到企业微信。
安装与基础配置:三步搞定
第一步:确认是否已安装
rpm -q rsyslog
如果显示版本号(比如rsyslog-8.2102.0-16.el8.x86_64
)说明已安装,否则执行:
sudo dnf install rsyslog -y
第二步:启动服务并设为开机自启

sudo systemctl enable --now rsyslog
这里有个坑:CentOS 8默认用systemd-journald
收集日志,但rsyslog和它是互补关系——journald负责收集,rsyslog负责处理和转发,所以不用禁用journald,两者可以共存。
第三步:修改主配置文件
主配置文件在/etc/rsyslog.conf
,但直接改这个文件容易混乱,推荐的做法是:
- 在
/etc/rsyslog.d/
下新建配置文件(比如my-config.conf
) - 写入规则(示例):
# 把所有内核日志存到单独文件 kern. /var/log/kern.log
把mail设施的info及以上级别存到mail.log
mail.info /var/log/mail.log
本地生成的日志(facility=local0)存到自定义文件
local0. /var/log/myapp.log
重启服务生效:
```bash
sudo systemctl restart rsyslog
进阶配置:日志过滤与远程传输
场景1:过滤特定关键词的日志 比如要抓取所有包含“ERROR”的Nginx日志,可以这样配置:
:msg, contains, "ERROR" /var/log/nginx-errors.log
这里用到了contains
匹配器,还有isequal
(精确匹配)、regex
(正则匹配)等选项。
场景2:远程日志收集 假设要把所有日志发到日志服务器(IP:192.168.1.100),配置如下:
# 客户端配置(发送方) . @192.168.1.100:514 # 服务端配置(接收方) module(load="imudp") # 加载UDP模块 input(type="imudp" port="514") # 监听514端口 template(name="RemoteLogs" type="string" string="/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log") # 定义日志路径模板 . ?RemoteLogs # 应用模板
注意:UDP传输可能丢包,生产环境建议用TCP(把换成)或RELP协议(更可靠但需要额外模块)。
实战案例:解决日志重复问题
上周遇到个奇葩问题:某台服务器的/var/log/messages
里重复记录了所有日志,导致磁盘空间爆满,排查后发现是配置文件里同时存在:
. /var/log/messages # 全局规则 mail. /var/log/mail.log # 特定规则
rsyslog的规则是“从上到下匹配”,但默认会继续处理后续规则,解决方法是在特定规则后加& ~
(停止进一步处理):
mail. /var/log/mail.log & ~
这样邮件日志只会写入mail.log
,不会重复写入messages
。
性能优化:让rsyslog跑得更快
对于高并发场景(比如每秒万级日志),默认配置可能扛不住,优化建议:
- 启用多线程:在
/etc/rsyslog.conf
顶部添加:$MainMsgQueueType LinkedList # 使用链表队列 $MainMsgQueueFileName mainq # 队列文件 $MainMsgQueueMaxFileSize 100m # 单个队列文件最大100M $MainMsgQueueSaveOnShutdown on # 关机时保存队列 $MainMsgQueueDiscardMark 5000 # 队列满时丢弃超过5000条的日志 $MainMsgQueueHighWaterMark 4000 # 队列达到4000条时开始丢弃 $MainMsgQueueLowWaterMark 2000 # 队列降到2000条时停止丢弃 $MainMsgQueueWorkerThreads 4 # 启用4个工作线程
- 使用磁盘辅助队列:如果内存不够,可以配置磁盘队列:
$MainMsgQueueType Disk # 改为磁盘队列 $MainMsgQueueDiskFileName mainq # 队列文件路径 $MainMsgQueueMaxFileSize 1g # 最大1G
故障排查:日志不记录?看这里!
遇到日志不记录的情况,按这个步骤排查:
- 检查服务状态:
sudo systemctl status rsyslog
如果显示
failed
,查看日志:journalctl -u rsyslog -n 50
- 检查配置语法:
sudo rsyslogd -N1
这个命令会检查配置文件语法,如果有错误会直接报出。
- 手动测试日志生成:
logger -p local0.info "Test message"
然后检查
/var/log/myapp.log
(根据你配置的路径)是否有这条日志。
rsyslog配置的三大原则
- 最小权限原则:远程传输时用非root用户,限制端口权限
- 日志分类原则:按设施、级别、应用分类存储,避免混在一起
- 备份与轮转原则:配合
logrotate
定期清理旧日志,防止磁盘爆满
现在回头看,rsyslog的配置其实不难,关键是要理解它的工作原理——先收集日志,再根据规则过滤和转发,掌握了这些,无论是解决日志混乱问题,还是搭建集中式日志系统,都能游刃有余,下次遇到服务器日志难题,不妨试试rsyslog,说不定会有意外收获!
文章评论