日志是服务器运维的“故障诊断书”,系统运行状态、应用报错详情全靠它追溯。但日志文件会像滚雪球一样持续增大,不仅吞噬宝贵磁盘空间,还会让日志检索变慢,甚至因磁盘爆满导致系统宕机!
今天我们就来深入探讨Linux系统自带的日志管理神器——logrotate。从工作原理到配置实践,带你实现日志的自动归档、压缩与清理,让服务器日志管理更高效、运行更稳定。
一、日志轮转:为什么是服务器“必备技能”?
日志轮转本质上是一套“日志生命周期管理机制”,其核心目标是防止日志无限增长,主要解决三大痛点:
- 避免磁盘爆满:自动清理超期日志,不让无用日志占用关键的磁盘空间。
- 提升检索效率:拆分后的日志体积更小,查询特定时间段的日志时速度会显著提升。
- 便于审计归档:按时间戳归档的日志,能直接满足合规审计和问题回溯的需求。
简单来说,日志轮转就像给日志“定期瘦身+存档”,是服务器实现自我保护、稳定运行的核心能力。
二、logrotate:Linux默认的日志管理王者
logrotate是Linux/Unix系统默认预装的日志轮转工具(CentOS、Ubuntu、Rocky Linux等主流发行版都自带),它能成为运维标配,主要依靠以下核心优势:
- 支持按天、周、月或按日志大小(如达到100M)触发轮转。
- 可以为
Nginx、MySQL、Tomcat等单个应用定制独立的轮转规则。
- 内置压缩、删除、邮件发送等实用功能。
- 支持执行自定义脚本,从而实现服务重载等复杂操作。
无论是系统日志(位于/var/log/),还是各类应用日志,其轮转管理大多都依赖于logrotate来实现。
三、快速上手:安装与基础检查
1. 先查是否已安装
在终端输入以下命令,如果能输出版本信息,则说明系统已预装:
logrotate --version
2. 手动安装(未预装时)
四、配置详解:灵活定制轮转规则
logrotate的配置分为“全局配置”和“子配置”。全局配置定义默认规则,而子配置则针对单个应用进行定制,优先级更高,可以覆盖全局设置。
1. 全局配置文件:/etc/logrotate.conf
此文件定义了服务器级的默认策略,适用于大多数普通日志。以下是一份推荐的配置,并附有详细注释:
# 轮转周期:weekly(每周)/daily(每天)/monthly(每月)
weekly
# 保留最近4个归档文件,超期自动删除
rotate 4
# 轮转后自动创建新日志文件
create
# 归档日志用gzip压缩(节省空间)
compress
# 延迟压缩:当前轮转的日志不压缩,下次再压缩(避免影响应用读写)
delaycompress
# 日志不存在时不报错(防止误报)
missingok
# 日志为空时不进行轮转
notifempty
# 归档文件加日期戳(如access.log-20250426.gz),方便识别
dateext
# 加载应用级的子配置
include /etc/logrotate.d
2. 子配置文件:/etc/logrotate.d/
每个应用的独立轮转规则通常放在/etc/logrotate.d/目录下,文件名与应用名一致(如nginx、mysql)。
示例1:Nginx日志轮转(/etc/logrotate.d/nginx)
# 匹配Nginx所有日志文件
/var/log/nginx/*.log {
daily # 每天轮转(覆盖全局的weekly设置)
missingok # 日志不存在时不报错
rotate 14 # 保留14天归档(覆盖全局的4次)
compress # 压缩归档
delaycompress # 延迟压缩
notifempty # 空日志不轮转
create 0640 nginx adm # 新建日志,权限0640,所有者nginx:adm
sharedscripts # 所有日志轮转后只执行1次脚本
postrotate # 轮转后重载Nginx,让其写入新日志
[ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscript
}
示例2:MySQL日志轮转(/etc/logrotate.d/mysql)
# 匹配MySQL所有日志文件
/var/log/mysql/*.log {
weekly # 每周轮转
rotate 8 # 保留8周(约2个月)归档
missingok # 日志不存在时不报错
compress # 压缩归档
notifempty # 空日志不轮转
create 640 mysql mysql # 新建日志,权限640,所有者mysql:mysql
sharedscripts # 统一执行脚本
postrotate # 轮转后刷新MySQL日志,避免写入异常
/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf flush-logs
endscript
}
对于数据库应用的日志轮转,务必确保postrotate脚本中的命令正确,且执行用户有相应权限,否则可能导致日志写入失败。
3. 核心参数速查表
| 指令 |
说明 |
daily/weekly/monthly |
轮转周期:每天/每周/每月 |
size 100M |
按大小触发(如日志达到100M立即轮转) |
rotate N |
保留N个归档文件,超期删除最早的 |
compress |
使用gzip压缩归档(后缀为.gz) |
delaycompress |
延迟压缩,当前轮转的日志下次再压缩 |
missingok |
日志不存在时不报错 |
notifempty |
空日志不进行轮转 |
create 权限 所有者 组 |
新建日志并指定权限、所有者(如0640 nginx adm) |
postrotate/endscript |
轮转后执行脚本(如重载服务),常与sharedscripts配合使用 |
dateext |
归档文件添加日期戳(如.log-20250426) |
五、工作原理:logrotate如何自动运行?
logrotate的自动执行依赖于Linux的cron定时任务,整个流程非常简单:
- 定时触发:位于
/etc/cron.daily/目录下的logrotate脚本,每天会被cron自动执行。
- 加载配置:先读取全局配置
/etc/logrotate.conf,再加载/etc/logrotate.d/目录下的所有子配置。
- 条件判断:检查每个日志文件是否满足轮转条件(时间或大小达标、文件存在且非空)。
- 执行轮转:重命名旧日志(添加日期戳)→ 压缩归档 → 创建新日志文件 → 删除超期的旧归档。
- 执行脚本:如果配置中定义了
postrotate部分,则自动执行其中的脚本(例如重新加载应用服务)。
整个过程对应用程序是透明的,通常不会影响服务的正常运行。
六、手动测试与故障排查(避坑必备)
配置完成后,强烈建议先进行手动测试,以避免在生产环境踩坑。
1. 手动测试轮转
(1)强制轮转单个配置
# 强制执行Nginx日志轮转(-f:强制触发)
sudo logrotate -f /etc/logrotate.d/nginx
(2)详细日志模式(推荐)
# -v:显示详细执行过程,-f:强制轮转,方便排查问题
sudo logrotate -vf /etc/logrotate.d/nginx
2. 常见故障排查
- 路径错误:检查配置文件中指定的日志路径、应用PID文件路径是否正确(例如Nginx的PID文件是否真的在
/run/nginx.pid)。
- 权限不足:新创建日志文件的权限需要与应用程序的运行用户匹配(例如Nginx使用
nginx用户运行,那么新日志的所有者应设为nginx)。
- 脚本报错:可以手动执行
postrotate中定义的命令,检查是否因为PID不存在、命令错误等原因导致失败。
- 查看系统日志:通过
grep logrotate /var/log/messages(CentOS系列)或查看/var/log/syslog(Ubuntu/Debian系列)来获取logrotate的执行日志,这对于诊断复杂的系统问题非常有帮助。
七、总结
logrotate作为Linux运维中不可或缺的“日志管家”,通过简单直观的配置,就能实现日志的自动化轮转、压缩与清理,从根本上解决日志无限增长带来的各种隐患。
无论是单台服务器还是大规模的集群环境,合理运用logrotate都能显著提升日志管理的效率与服务器稳定性。希望本文的实践指南能帮助你更好地掌握这个工具。如果你想与更多技术同好交流运维心得,欢迎来云栈社区分享你的经验。