CentOS如何正确配置rsyslog实现软件接入?

代码编程 2025-08-22 786

最近公司服务器迁移,新买的几台CentOS 8机器需要统一日志管理,领导让我搞定rsyslog的配置,说实话,之前我只在Ubuntu上玩过syslog-ng,对rsyslog的印象还停留在“CentOS默认日志工具”这个层面,但经过三天实战,从安装到高级配置,再到故障排查,现在总算能拍着胸脯说:“这活我熟!”今天就把整个过程掰开了揉碎了讲,保证让新手也能跟着操作,老手也能找到优化灵感。

为什么选rsyslog?它到底强在哪?

先说个真实案例:上周运维部小王用rsyslog把20台服务器的日志集中到一台日志服务器,结果发现某台Web服务器的Nginx访问日志里混着MySQL的错误日志,一问才知道,他直接用了默认配置,所有日志都往/var/log/messages里灌,这就是不配置rsyslog的典型后果——日志混乱,排查问题像大海捞针。

CentOS配置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

第二步:启动服务并设为开机自启

CentOS配置rsyslog-软件接入-软件接入
sudo systemctl enable --now rsyslog

这里有个坑:CentOS 8默认用systemd-journald收集日志,但rsyslog和它是互补关系——journald负责收集,rsyslog负责处理和转发,所以不用禁用journald,两者可以共存。

第三步:修改主配置文件 主配置文件在/etc/rsyslog.conf,但直接改这个文件容易混乱,推荐的做法是:

  1. /etc/rsyslog.d/下新建配置文件(比如my-config.conf
  2. 写入规则(示例):
    # 把所有内核日志存到单独文件
    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跑得更快

对于高并发场景(比如每秒万级日志),默认配置可能扛不住,优化建议:

  1. 启用多线程:在/etc/rsyslog.conf顶部添加:
    $MainMsgQueueType LinkedList  # 使用链表队列
    $MainMsgQueueFileName mainq   # 队列文件
    $MainMsgQueueMaxFileSize 100m # 单个队列文件最大100M
    $MainMsgQueueSaveOnShutdown on # 关机时保存队列
    $MainMsgQueueDiscardMark 5000 # 队列满时丢弃超过5000条的日志
    $MainMsgQueueHighWaterMark 4000 # 队列达到4000条时开始丢弃
    $MainMsgQueueLowWaterMark 2000 # 队列降到2000条时停止丢弃
    $MainMsgQueueWorkerThreads 4 # 启用4个工作线程
  2. 使用磁盘辅助队列:如果内存不够,可以配置磁盘队列:
    $MainMsgQueueType Disk # 改为磁盘队列
    $MainMsgQueueDiskFileName mainq # 队列文件路径
    $MainMsgQueueMaxFileSize 1g # 最大1G

故障排查:日志不记录?看这里!

遇到日志不记录的情况,按这个步骤排查:

  1. 检查服务状态
    sudo systemctl status rsyslog

    如果显示failed,查看日志:

    journalctl -u rsyslog -n 50
  2. 检查配置语法
    sudo rsyslogd -N1

    这个命令会检查配置文件语法,如果有错误会直接报出。

  3. 手动测试日志生成
    logger -p local0.info "Test message"

    然后检查/var/log/myapp.log(根据你配置的路径)是否有这条日志。

rsyslog配置的三大原则

  1. 最小权限原则:远程传输时用非root用户,限制端口权限
  2. 日志分类原则:按设施、级别、应用分类存储,避免混在一起
  3. 备份与轮转原则:配合logrotate定期清理旧日志,防止磁盘爆满

现在回头看,rsyslog的配置其实不难,关键是要理解它的工作原理——先收集日志,再根据规则过滤和转发,掌握了这些,无论是解决日志混乱问题,还是搭建集中式日志系统,都能游刃有余,下次遇到服务器日志难题,不妨试试rsyslog,说不定会有意外收获!

如何实现CentOS日志高效上传至ELK的落地实践?
« 上一篇 2025-08-22
CentOS中如何利用journalctl提升质量保障效果?
下一篇 » 2025-08-22

文章评论