CentOS Syslog日志轮转策略解析
小樊
44
2025-12-17 12:35:59
CentOS Syslog日志轮转策略解析
一 核心组件与工作机制
- 日志写入由rsyslog负责,规则通常在**/etc/rsyslog.conf与/etc/rsyslog.d/中定义,常见路径包括/var/log/messages**、/var/log/secure、/var/log/cron等。系统日志的落盘与轮转解耦:rsyslog持续写入当前日志文件,轮转由logrotate按周期或条件重命名/压缩/清理旧文件。logrotate的主配置为**/etc/logrotate.conf**,并通过include /etc/logrotate.d/加载各服务片段;执行通常由/etc/cron.daily/logrotate每日触发。rsyslog从systemd journal读取本地日志(imjournal),不再依赖传统的/var/run/log套接字。
二 配置文件与关键参数
- 全局与包含
- 在**/etc/logrotate.conf中可设置全局策略(如daily/weekly/monthly**、rotate N、compress、dateext、以及include /etc/logrotate.d)。dateext启用日期后缀(如 secure-20241010),便于按日期保留与检索。
- 服务片段示例(/etc/logrotate.d/syslog 或 rsyslog)
- 常见写法:
- /var/log/messages、/var/log/secure、/var/log/maillog、/var/log/cron {
- daily
- rotate 7
- compress
- delaycompress
- missingok
- notifempty
- create 0640 root adm
- sharedscripts
- postrotate
- /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
- endscript
- }
- 关键指令说明
- daily/weekly/monthly:按时间周期触发
- rotate N:保留N个旧日志
- compress/delaycompress:压缩旧日志(delaycompress常用于保留最近一份未压缩以便快速回溯)
- missingok/notifempty:文件缺失或为空时不报错/不轮转
- create mode owner group:轮转后重建新文件的权限与属主
- size 100M:达到指定大小即触发(可与时间条件并存,满足其一即触发)
- minsize 1M:至少达到该大小才满足时间条件触发
- dateext:使用日期作为后缀,避免序号回绕冲突
- sharedscripts/postrotate/endscript:在轮转前后执行脚本;对rsyslog推荐用HUP信号让其重新打开日志文件,避免copytruncate带来的文件句柄与潜在丢日志风险。
三 触发时机与执行方式
- 定时触发:默认由**/etc/cron.daily/logrotate调用/usr/sbin/logrotate /etc/logrotate.conf**执行,通常每日运行一次。
- 手动触发与验证
- 强制执行一次:logrotate -f /etc/logrotate.d/syslog(或-f /etc/logrotate.conf)
- 干跑/调试:logrotate -d /etc/logrotate.d/syslog(显示将要执行的操作而不真正轮转)
- 观察轮转结果:ls -lh /var/log/messages*;查看轮转状态与系统日志:tail -f /var/log/messages。
四 常见场景与推荐配置
- 高频日志(如心跳、监控、调试):建议“时间+大小”双阈值,避免单日暴涨
- /var/log/messages {
- daily
- rotate 7
- compress
- delaycompress
- missingok
- notifempty
- create 0640 root adm
- size 100M
- sharedscripts
- postrotate
- /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
- endscript
- }
- 安全与审计日志(secure):更长的保留期与严格权限
- /var/log/secure {
- daily
- rotate 30
- compress
- delaycompress
- missingok
- notifempty
- create 0600 root root
- sharedscripts
- postrotate
- /usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
- endscript
- }
- 不建议对rsyslog使用copytruncate:可能导致日志写入短暂中断、句柄复用引发应用写入错位或丢失;优先使用postrotate + HUP让rsyslog重新打开日志文件。
五 故障排查与最佳实践
- 排查要点
- 检查服务与权限:systemctl status rsyslog;ls -l /var/log | grep -E ‘messages|secure|maillog|cron’
- 手动执行并观察:logrotate -dvf /etc/logrotate.d/syslog;tail -f /var/log/messages
- 确认定时任务存在且可执行:cat /etc/cron.daily/logrotate
- 最佳实践
- 使用dateext便于审计与追溯;为不同日志设置差异化保留期(如secure保留更久)
- 统一在**/etc/logrotate.d/**维护服务片段,避免直接改动全局配置
- 采用postrotate HUP而非copytruncate;必要时用sharedscripts确保脚本只执行一次
- 对大文件与关键业务日志设置size阈值,避免磁盘被瞬时打满
- 结合集中式日志平台(如ELK或Loki)做长期留存与检索,降低单机磁盘压力。