logrotate 是 Linux 系统中用于 自动轮转、压缩、删除和邮件日志文件 的实用工具,防止日志文件过大占满磁盘空间。它通过 /etc/logrotate.conf/etc/logrotate.d/ 下的配置文件来管理日志轮转策略。


📌 基本工作原理

  • 轮转(rotate):将当前日志文件重命名(如 access.logaccess.log.1),并创建新的空日志文件。
  • 压缩:轮转后的旧日志可压缩为 .gz 节省空间。
  • 删除:按策略保留指定数量的旧日志,超出的自动删除。
  • 信号通知:轮转后向相关进程(如 nginxrsyslog)发送信号(如 USR1HUP),使其重新打开日志文件。

🛠️ 配置文件结构

1. 主配置文件

/etc/logrotate.conf(全局配置):

weekly          # 每周轮转一次
rotate 4        # 保留4个旧日志
create          # 轮转后创建新日志文件
compress        # 压缩旧日志
include /etc/logrotate.d  # 加载子配置
2. 子配置文件

/etc/logrotate.d/ 目录下的文件(如 nginx, syslog):

/var/log/nginx/*.log {
    daily               # 每天轮转
    missingok           # 日志不存在时不报错
    rotate 14           # 保留14天
    compress            # 压缩旧日志
    delaycompress       # 延迟压缩(下次轮转时压缩)
    notifempty          # 空日志不轮转
    create 0644 www-data adm  # 新日志权限及属主
    postrotate
        # 通知nginx重新打开日志文件
        nginx -s reopen
    endscript
}

🔍 常用参数

参数 说明
daily/weekly/monthly/yearly 轮转周期
rotate N 保留N个旧日志后删除
compress 用gzip压缩旧日志
delaycompress 延迟到下次轮转时才压缩
missingok 日志文件不存在时不报错
notifempty 日志为空时不轮转
create mode owner group 指定新日志文件的权限和属主
sharedscripts 当配置了 sharedscripts 时,prerotate 和 postrotate 脚本在整个日志轮转过程中只执行一次,而不是为每个日志文件执行一次
prerotate/endscript 轮转前执行的命令(如启动服务)
postrotate/endscript 轮转后执行的命令(如重启服务)

🚀 手动触发轮转

测试配置是否正确:

sudo logrotate -d /etc/logrotate.conf  # 调试模式(仅显示操作)

强制轮转某个日志:

sudo logrotate -f /etc/logrotate.d/nginx

🚨 常见问题

  1. 日志未轮转

    • 检查日志文件是否被进程锁定(如 lsof /var/log/nginx/access.log)。
    • 确认 logrotate 的 cron 任务存在(通常在 /etc/cron.daily/logrotate)。
  2. 权限错误

    • 确保 logrotate 有权限读取日志目录(如 /var/log/nginx/ 需允许 logrotate 用户访问)。
  3. 轮转后日志未写入

    • 检查 postrotate 脚本是否正确发送信号(如 nginx -s reopenkill -USR1 $(cat /var/run/nginx.pid))。

📅 每日自动执行

logrotate 通过 cron 每日运行:

cat /etc/cron.daily/logrotate
# 内容通常是:/usr/sbin/logrotate /etc/logrotate.conf

📖 示例:自定义日志轮转

/var/log/myapp/*.log 设置轮转:

/var/log/cron
/var/log/myapp/*.log 
{
    daily
    rotate 30
    compress
    missingok
    notifempty
    create 0644 root root
    postrotate
        systemctl reload myapp  # 假设需要重启服务
    endscript
}

保存为 /etc/logrotate.d/myapp 即可生效。

ubuntu ngin模版

/var/log/nginx/*.log {
        daily
        missingok
        rotate 14
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
        sharedscripts
        prerotate
                if [ -d /etc/logrotate.d/httpd-prerotate ]; then
                        run-parts /etc/logrotate.d/httpd-prerotate;
                fi
        endscript
        postrotate
                invoke-rc.d nginx rotate >/dev/null 2>&1
        endscript
}

centos nginx模板

/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 640 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

如果需要进一步分析某个具体场景或调试问题,请提供更多细节!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐