日志轮转 (logrotate)
日志文件会随着时间不断增长,如果不加管理,最终会占满磁盘空间。logrotate 是 Linux 系统默认的日志轮转工具,可以自动压缩、删除、轮转日志文件。本文将介绍 logrotate 的配置结构、自定义规则编写、常用参数以及测试方法。
logrotate 概述
Section titled “logrotate 概述”logrotate 由 systemd timer(EL 8+)或 cron 定时任务每天自动执行一次,读取配置文件中的规则,对指定的日志文件进行轮转。
rpm -q logrotatesystemctl status logrotate.timer配置文件结构
Section titled “配置文件结构”logrotate 的配置由两部分组成:
全局配置文件
Section titled “全局配置文件”cat /etc/logrotate.conf全局配置文件 /etc/logrotate.conf 定义了默认的轮转策略:
# 每周轮转weekly
# 保留 4 个旧日志rotate 4
# 轮转后创建新的空日志文件create
# 使用日期作为后缀dateext
# 压缩旧日志compress
# 包含自定义配置目录include /etc/logrotate.d自定义配置目录
Section titled “自定义配置目录”ls /etc/logrotate.d/每个应用程序可以在 /etc/logrotate.d/ 目录下放置自己的轮转配置文件。
核心配置参数
Section titled “核心配置参数”| 参数 | 含义 |
|---|---|
daily | 每天轮转 |
weekly | 每周轮转 |
monthly | 每月轮转 |
yearly | 每年轮转 |
| 参数 | 含义 |
|---|---|
rotate N | 保留 N 个旧日志文件 |
maxage N | 删除超过 N 天的旧日志 |
文件大小控制
Section titled “文件大小控制”| 参数 | 含义 |
|---|---|
size 100M | 日志超过 100M 时才轮转 |
minsize 50M | 日志至少达到 50M 才轮转(配合频率) |
maxsize 500M | 日志超过 500M 立即轮转(不等频率) |
| 参数 | 含义 |
|---|---|
compress | 使用 gzip 压缩旧日志 |
nocompress | 不压缩 |
compresscmd bzip2 | 使用指定压缩程序 |
delaycompress | 延迟一个周期再压缩(配合 copytruncate 使用) |
| 参数 | 含义 |
|---|---|
create 0640 root adm | 轮转后创建新文件并设置权限 |
copytruncate | 复制后截断原文件(适用于不支持信号重载的程序) |
missingok | 如果日志文件不存在,不报错 |
notifempty | 如果日志文件为空,不轮转 |
sharedscripts | 所有匹配文件只执行一次脚本 |
| 参数 | 含义 |
|---|---|
dateext | 使用日期替代数字后缀 |
dateformat -%Y%m%d | 自定义日期格式 |
dateyesterday | 使用昨天的日期作为后缀 |
创建自定义轮转规则
Section titled “创建自定义轮转规则”Nginx 日志轮转
Section titled “Nginx 日志轮转”sudo tee /etc/logrotate.d/nginx << 'EOF'/var/log/nginx/*.log { daily rotate 30 missingok notifempty compress delaycompress dateext sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 $(cat /var/run/nginx.pid) endscript}EOF说明:
postrotate / endscript— 轮转后执行的脚本,发送 USR1 信号让 Nginx 重新打开日志文件delaycompress— 最新的旧日志不压缩,方便查看sharedscripts— 多个日志文件只发一次信号
应用程序日志轮转
Section titled “应用程序日志轮转”sudo tee /etc/logrotate.d/myapp << 'EOF'/var/log/myapp/*.log { daily rotate 14 missingok notifempty compress copytruncate size 100M dateext dateformat -%Y%m%d}EOF说明:
copytruncate— 复制日志文件后截断原文件,适用于无法通过信号重新打开日志的应用程序size 100M— 仅当文件超过 100M 时才轮转
Tomcat / Java 应用日志轮转
Section titled “Tomcat / Java 应用日志轮转”sudo tee /etc/logrotate.d/tomcat << 'EOF'/opt/tomcat/logs/catalina.out { daily rotate 7 missingok notifempty compress copytruncate maxsize 500M dateext}
/opt/tomcat/logs/catalina.*.log/opt/tomcat/logs/localhost.*.log { daily rotate 7 missingok notifempty compress maxage 30}EOF系统 syslog 轮转
Section titled “系统 syslog 轮转”cat /etc/logrotate.d/syslog使用 -d 参数测试(dry run)
Section titled “使用 -d 参数测试(dry run)”-d 参数进行模拟运行,不会实际修改任何文件,仅显示将要执行的操作:
sudo logrotate -d /etc/logrotate.confsudo logrotate -d /etc/logrotate.d/nginx输出会显示每个日志文件是否需要轮转以及将执行的操作,用于验证配置是否正确。
使用 -v 参数详细输出
Section titled “使用 -v 参数详细输出”sudo logrotate -v /etc/logrotate.conf强制执行轮转
Section titled “强制执行轮转”使用 -f 参数强制对所有日志文件执行轮转,忽略时间和大小条件:
sudo logrotate -f /etc/logrotate.confsudo logrotate -f /etc/logrotate.d/nginxsudo logrotate -vf /etc/logrotate.d/nginxlogrotate 状态文件
Section titled “logrotate 状态文件”logrotate 通过状态文件记录每个日志上次轮转的时间:
cat /var/lib/logrotate/logrotate.status如果需要重置某个日志的轮转状态,可以编辑此文件或删除对应行。
常见问题排查
Section titled “常见问题排查”日志没有按预期轮转
Section titled “日志没有按预期轮转”systemctl status logrotate.timerjournalctl -u logrotate --no-pager -n 20sudo logrotate -d /etc/logrotate.d/nginxls -la /var/log/nginx/ls -la /etc/logrotate.d/logrotate 配置文件不能被组或其他用户可写,否则会被跳过。
sudo chmod 644 /etc/logrotate.d/nginxcopytruncate 与 postrotate 的选择
Section titled “copytruncate 与 postrotate 的选择”- copytruncate — 适用于不支持信号通知的程序(如某些 Java 应用),但在复制和截断之间可能丢失少量日志
- postrotate + 信号 — 更可靠,适用于支持重新打开日志文件的程序(如 Nginx、Apache)
- 为每个应用创建独立配置文件 — 放在
/etc/logrotate.d/目录下 - 修改后用 -d 测试 — 确认配置正确后再等待实际轮转
- 合理设置保留数量 — 根据磁盘空间和合规要求确定
- 使用 dateext — 日期后缀比数字后缀更易识别
- 配合监控 — 监控磁盘使用率,确保轮转正常工作
- 使用 compress — 节省磁盘空间,尤其是文本日志压缩率很高