跳转到内容

日志轮转 (logrotate)

日志文件会随着时间不断增长,如果不加管理,最终会占满磁盘空间。logrotate 是 Linux 系统默认的日志轮转工具,可以自动压缩、删除、轮转日志文件。本文将介绍 logrotate 的配置结构、自定义规则编写、常用参数以及测试方法。

logrotate 由 systemd timer(EL 8+)或 cron 定时任务每天自动执行一次,读取配置文件中的规则,对指定的日志文件进行轮转。

确认 logrotate 已安装
rpm -q logrotate
查看 logrotate 定时器状态 (EL 8+)
systemctl status logrotate.timer

logrotate 的配置由两部分组成:

查看全局配置
cat /etc/logrotate.conf

全局配置文件 /etc/logrotate.conf 定义了默认的轮转策略:

/etc/logrotate.conf 默认内容
# 每周轮转
weekly
# 保留 4 个旧日志
rotate 4
# 轮转后创建新的空日志文件
create
# 使用日期作为后缀
dateext
# 压缩旧日志
compress
# 包含自定义配置目录
include /etc/logrotate.d
列出已有的轮转规则
ls /etc/logrotate.d/

每个应用程序可以在 /etc/logrotate.d/ 目录下放置自己的轮转配置文件。

参数含义
daily每天轮转
weekly每周轮转
monthly每月轮转
yearly每年轮转
参数含义
rotate N保留 N 个旧日志文件
maxage N删除超过 N 天的旧日志
参数含义
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使用昨天的日期作为后缀
创建 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 — 多个日志文件只发一次信号
创建自定义应用日志轮转配置
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 日志轮转配置
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 轮转配置
cat /etc/logrotate.d/syslog

-d 参数进行模拟运行,不会实际修改任何文件,仅显示将要执行的操作:

测试所有轮转规则(dry run)
sudo logrotate -d /etc/logrotate.conf
测试单个配置文件
sudo logrotate -d /etc/logrotate.d/nginx

输出会显示每个日志文件是否需要轮转以及将执行的操作,用于验证配置是否正确。

以详细模式运行轮转
sudo logrotate -v /etc/logrotate.conf

使用 -f 参数强制对所有日志文件执行轮转,忽略时间和大小条件:

强制轮转所有日志
sudo logrotate -f /etc/logrotate.conf
强制轮转单个配置
sudo logrotate -f /etc/logrotate.d/nginx
强制轮转并显示详细信息
sudo logrotate -vf /etc/logrotate.d/nginx

logrotate 通过状态文件记录每个日志上次轮转的时间:

查看 logrotate 状态文件
cat /var/lib/logrotate/logrotate.status

如果需要重置某个日志的轮转状态,可以编辑此文件或删除对应行。

检查 logrotate timer 是否正常
systemctl status logrotate.timer
journalctl -u logrotate --no-pager -n 20
检查配置文件语法
sudo logrotate -d /etc/logrotate.d/nginx
检查日志文件权限
ls -la /var/log/nginx/
检查 logrotate 配置文件权限
ls -la /etc/logrotate.d/

logrotate 配置文件不能被组或其他用户可写,否则会被跳过。

修复配置文件权限
sudo chmod 644 /etc/logrotate.d/nginx
  • copytruncate — 适用于不支持信号通知的程序(如某些 Java 应用),但在复制和截断之间可能丢失少量日志
  • postrotate + 信号 — 更可靠,适用于支持重新打开日志文件的程序(如 Nginx、Apache)
  1. 为每个应用创建独立配置文件 — 放在 /etc/logrotate.d/ 目录下
  2. 修改后用 -d 测试 — 确认配置正确后再等待实际轮转
  3. 合理设置保留数量 — 根据磁盘空间和合规要求确定
  4. 使用 dateext — 日期后缀比数字后缀更易识别
  5. 配合监控 — 监控磁盘使用率,确保轮转正常工作
  6. 使用 compress — 节省磁盘空间,尤其是文本日志压缩率很高