Logrotate 日志轮转配置教程

Logrotate 是 Linux 系统中用于自动轮转、压缩和清理日志文件的工具。如果不及时处理,日志文件会不断增长直到耗尽磁盘空间。在搬瓦工 VPS 上,尤其是磁盘空间有限的方案中,合理配置 Logrotate 非常重要。本教程将详细讲解 Logrotate 的配置方法和实际应用。

一、Logrotate 工作原理

Logrotate 由系统的 cron 定时任务每天调用一次,读取配置文件中定义的规则,对符合条件的日志执行轮转操作。轮转过程包括重命名当前日志、创建新的空日志文件、压缩旧日志、删除过期的日志文件。

# 查看 Logrotate 的 cron 任务
cat /etc/cron.daily/logrotate

# 查看 Logrotate 版本
logrotate --version

二、配置文件结构

Logrotate 的主配置文件为 /etc/logrotate.conf,各应用的独立配置文件存放在 /etc/logrotate.d/ 目录中。

2.1 主配置文件

# /etc/logrotate.conf
# 全局默认设置

# 每周轮转一次
weekly

# 保留 4 个归档文件
rotate 4

# 轮转后创建新的日志文件
create

# 使用日期作为轮转文件后缀
dateext

# 压缩旧日志
compress

# 包含应用专属配置
include /etc/logrotate.d

2.2 常用配置指令

/var/log/myapp/*.log {
    # 轮转频率
    daily               # 每天轮转
    # weekly            # 每周轮转
    # monthly           # 每月轮转

    # 保留数量
    rotate 14           # 保留 14 个归档

    # 压缩选项
    compress            # 压缩归档日志
    delaycompress       # 延迟一个周期再压缩
    compresscmd /usr/bin/xz    # 使用 xz 压缩
    compressext .xz            # 压缩文件扩展名

    # 文件处理
    missingok           # 日志文件不存在也不报错
    notifempty          # 空文件不轮转
    create 0640 root adm      # 创建新日志(权限 属主 属组)
    copytruncate        # 复制后截断(适合不支持重载的应用)

    # 大小限制
    size 100M           # 达到 100MB 时轮转
    minsize 50M         # 至少达到 50MB 才轮转
    maxsize 500M        # 超过 500MB 时强制轮转

    # 日期格式
    dateext             # 使用日期后缀
    dateformat -%Y%m%d  # 日期格式
}

三、实际配置示例

3.1 Nginx 日志轮转

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily
    rotate 30
    missingok
    notifempty
    compress
    delaycompress
    dateext
    sharedscripts
    postrotate
        if [ -f /var/run/nginx.pid ]; then
            kill -USR1 $(cat /var/run/nginx.pid)
        fi
    endscript
}

3.2 MySQL 慢查询日志

# /etc/logrotate.d/mysql-slow
/var/log/mysql/slow-query.log {
    daily
    rotate 7
    missingok
    notifempty
    compress
    delaycompress
    create 0640 mysql adm
    sharedscripts
    postrotate
        if [ -f /var/run/mysqld/mysqld.pid ]; then
            kill -HUP $(cat /var/run/mysqld/mysqld.pid)
        fi
    endscript
}

3.3 自定义应用日志

# /etc/logrotate.d/myapp
/var/log/myapp/app.log
/var/log/myapp/error.log {
    daily
    rotate 14
    missingok
    notifempty
    compress
    delaycompress
    copytruncate
    size 50M
    dateext
    dateformat -%Y%m%d-%H%M%S
}

# Docker 容器日志
/var/lib/docker/containers/*/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    copytruncate
    size 100M
}

3.4 按大小轮转

# /etc/logrotate.d/large-logs
/var/log/large-app/*.log {
    size 200M
    rotate 5
    compress
    missingok
    notifempty
    copytruncate
    postrotate
        echo "日志已轮转: $(date)" >> /var/log/logrotate-notify.log
    endscript
}

四、脚本钩子

Logrotate 支持在轮转前后执行自定义脚本:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress

    # 轮转前执行
    prerotate
        echo "开始轮转: $(date)" >> /var/log/logrotate-audit.log
    endscript

    # 轮转后执行
    postrotate
        systemctl reload myapp 2>/dev/null || true
    endscript

    # 首次轮转后执行(所有文件轮转完毕后只执行一次)
    lastaction
        # 发送通知
        echo "所有日志轮转完成" | mail -s "Logrotate 完成" admin@example.com
    endscript
}

五、测试与调试

# 模拟运行(不实际执行)
logrotate -d /etc/logrotate.d/nginx

# 强制立即执行轮转
logrotate -f /etc/logrotate.d/nginx

# 详细输出
logrotate -v /etc/logrotate.conf

# 同时使用详细和调试模式
logrotate -dv /etc/logrotate.d/myapp

# 查看轮转状态记录
cat /var/lib/logrotate/status

六、常见问题与解决

6.1 日志文件不轮转

# 检查配置文件语法
logrotate -d /etc/logrotate.d/myapp

# 检查状态文件中的时间戳
grep "myapp" /var/lib/logrotate/status

# 强制重置状态
echo '"/var/log/myapp/app.log" 2020-1-1' > /var/lib/logrotate/status

6.2 磁盘空间已满

# 紧急清理日志
truncate -s 0 /var/log/syslog
truncate -s 0 /var/log/kern.log

# 删除旧的压缩日志
find /var/log -name "*.gz" -mtime +7 -delete

# 查看日志目录大小
du -sh /var/log/
du -sh /var/log/* | sort -rh | head -10

6.3 权限问题

# 确保 Logrotate 有权限操作日志文件
ls -la /var/log/myapp/

# 修复权限
chown root:adm /var/log/myapp/
chmod 755 /var/log/myapp/

七、最佳实践

  • 磁盘有限时使用 size 指令:搬瓦工 VPS 磁盘空间通常有限,使用 size 指令按大小轮转比按时间更安全。
  • 始终启用 compress:压缩可以节省 80% 以上的磁盘空间。
  • 使用 delaycompress:延迟压缩可以方便查看最近一次轮转的日志。
  • 合理设置 rotate 数量:根据磁盘空间和日志重要性设置保留数量。
  • Docker 日志控制:Docker 容器日志也需要轮转,或者在 daemon.json 中限制日志大小。

总结

Logrotate 是防止日志撑满磁盘的关键工具。在搬瓦工 VPS 上正确配置 Logrotate,可以确保日志系统长期稳定运行。建议搭配 Rsyslog 日志管理Journalctl 日志查看 教程一起学习,全面掌握 Linux 日志管理。选购搬瓦工 VPS 请查看全部方案,使用优惠码 NODESEEK2026 可享受 6.77% 循环折扣。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。