Logrotate日志分割

适用环境:yum(CentOS 8+ 应用 dnf)。文中命令按当时环境记录,新系统上请对照官方文档调整。

logrotate是一个linux系统日志的管理工具。可以对单个日志文件或者某个目录下的文件按时间/大小进行切割,压缩操作;指定日志保存数量;还可以在切割之后运行自定义命令。

yum install -y logrotate

创建目录

mkdir -p /var/log/nginx/access_logs
mkdir -p /var/log/nginx/error_logs

配置文件

vim /etc/logrotate.d/nginx
/var/log/nginx/*access.log {
    daily
    # 按天分割日志
    dateext
    # 使用日期作为分割后的日志文件的后缀
    dateformat -%Y-%m-%d
    # 指定日期格式为-YYYY-MM-DD
    missingok
    # 如果日志文件不存在,不报错继续处理下一个日志文件
    rotate 14
    # 保留14个旧的日志文件
    compress
    # 对分割后的日志文件进行压缩
    delaycompress
    # 延迟到下一个轮转周期压缩日志文件
    notifempty
    # 如果日志文件为空,不进行分割
    create 0640 nginx adm
    # 以0640的权限创建新的日志文件,并设置所有者和所属组为nginx和adm
    olddir /var/log/nginx/access_logs
    # 指定旧的日志文件存放位置
    sharedscripts
    # 脚本只运行一次而不是每个日志文件运行一次
    postrotate
    # 在日志分割后执行的脚本
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

/var/log/nginx/*error.log {
    daily
    # 按天分割日志
    dateext
    # 使用日期作为分割后的日志文件的后缀
    dateformat -%Y-%m-%d
    # 指定日期格式为-YYYY-MM-DD
    missingok
    # 如果日志文件不存在,不报错继续处理下一个日志文件
    rotate 14
    # 保留14个旧的日志文件
    compress
    # 对分割后的日志文件进行压缩
    delaycompress
    # 延迟到下一个轮转周期压缩日志文件
    notifempty
    # 如果日志文件为空,不进行分割
    create 0640 nginx adm
    # 以0640的权限创建新的日志文件,并设置所有者和所属组为nginx和adm
    olddir /var/log/nginx/error_logs
    # 指定旧的日志文件存放位置
    sharedscripts
    # 脚本只运行一次而不是每个日志文件运行一次
    postrotate
    # 在日志分割后执行的脚本
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

调试模式验证结果

logrotate -d /etc/logrotate.d/nginx

成功标志!

alt%20text.webp

强制执行日志轮转

logrotate -vf /etc/logrotate.d/nginx

验证结果

ls /var/log/nginx/access_logs
ls /var/log/nginx/error_logs

示例

需求是: 每次分割后迁移到指定目录

问题的主要原因是 postrotate 脚本在文件压缩之前执行

logrotate 提供了 lastaction 脚本,它在所有操作(包括压缩)完成后执行。将 mv 命令移到 lastaction 脚本中

[root@iZi5c01zlzty2isavfgor8Z nginx_log]# cat /etc/logrotate.d/nginx 
/opt/nginx_log/*.log {
    daily
    missingok
    rotate 1
    compress
    notifempty
    create 0644 root root
    sharedscripts
    dateext
    dateformat -%Y-%m-%d

    postrotate
        echo "运行后轮换脚本"
        if [ -f /usr/local/nginx/conf/nginx.pid ]; then
            echo "重启nginx"
            kill -USR1 `cat /usr/local/nginx/conf/nginx.pid`
        fi
    endscript

    lastaction
        echo "移动日志到 /mnt/data/nginx_log/"
        if find /opt/nginx_log/ -name "*.log-*.gz" -print -quit | grep -q .; then
            find /opt/nginx_log/ -name "*.log-*.gz" -exec /bin/mv {} /mnt/data/nginx_log/ \;
        else
            echo "未找到压缩日志文件。"
        fi
    endscript
}
0 子项 · 2 次浏览 · 2026-09-24