logrotate 是 Linux 默认日志轮转工具,支持按时间、大小自动归档压缩清理;配置含全局文件 /etc/logrotate.conf 与服务专属文件(如 /etc/logrotate.d/nginx),可手动测试或通过 systemd timer 调度。

如果您的 Linux 系统中日志文件持续增长而未加管控,可能导致磁盘空间耗尽或日志检索效率下降。logrotate 是系统默认提供的日志轮转 工具,通过配置可实现按时间、大小自动归档、压缩与清理。以下是具体配置实践步骤:
一、基础 配置文件 结构说明
logrotate 主配置由全局配置文件 /etc/logrotate.conf 驱动,该文件定义默认行为,并通过 include 指令加载 /etc/logrotate.d/ 目录下各服务的独立配置。每个配置块针对特定日志路径设定轮转策略,语法严格依赖缩进与关键字顺序。
1、使用文本编辑器打开全局配置文件:sudo nano /etc/logrotate.conf
2、确认存在包含语句:include /etc/logrotate.d
3、检查 /etc/logrotate.d/ 目录是否存在且可读:ls -l /etc/logrotate.d/
二、按天轮转并保留 7 份压缩归档
此方案适用于访问量稳定、单日日志体积可控的服务(如nginx access.log),确保每日生成新日志,旧日志以。gz 压缩保存,超过 7 天自动删除。
1、在 /etc/logrotate.d/ 下创建服务专属配置文件:sudo nano /etc/logrotate.d/nginx
2、写入以下内容:
/var/log/nginx/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0644 www-data www-data
sharedscripts
postrotate
if [-f /var/run/nginx.pid]; then
kill -USR1 `cat /var/run/nginx.pid`
fi
endscript
}
三、按大小触发轮转并限制总占用空间
当某类日志突发增长(如调试模式下的应用日志),仅按时间轮转可能无法及时释放空间。启用 size 参数可在日志达到指定 字节 数时立即触发轮转,配合 maxsize 可避免单次归档过大。
1、新建配置文件:sudo nano /etc/logrotate.d/app-debug
2、填入如下配置:
/var/log/myapp/debug.log {
size 100M
maxsize 200M
rotate 5
compress
copytruncate
missingok
notifempty
}
四、手动强制执行并验证轮转效果
配置完成后不需等待定时任务,可立即运行 logrotate 进行测试,添加 - d 参数可模拟执行并输出详细过程,- v 参数显示实际动作,避免误删真实日志。
1、执行预演模式查看行为逻辑:sudo logrotate -d /etc/logrotate.conf
2、执行一次真实轮转(仅作用于匹配配置的文件):sudo logrotate -v /etc/logrotate.conf
3、检查归档文件是否生成:ls -lt /var/log/nginx/
4、确认原始日志是否被截断或重建:stat /var/log/nginx/access.log
五、配置 systemd timer 替代 cron 调度
部分现代发行版(如 Ubuntu 20.04+、CentOS 8+)使用 systemd 管理 logrotate 调度,其精度与依赖控制优于传统 cron。需禁用 crontab 中的 logrotate 条目,并启用对应 timer 单元。
1、停用 cron 调度:sudo systemctl mask logrotate.timer
2、启用 systemd 原生 timer:sudo systemctl enable –now logrotate.timer
3、查看下次触发时间:sudo systemctl list-timers logrotate.timer
4、检查 timer 状态是否活跃:sudo systemctl status logrotate.timer