«

Nginx日志切割,按天切割nginx日志

时间:2026-10-7 07:49     作者:emer     分类: 无


前言

Nginx 的访问日志一直写在一个文件里,越写越大,几百GB都有可能。磁盘满了网站就挂了。本文讲一下怎么用 logrotate 自动按天切割 Nginx 日志。

为什么要切割日志

方法一:用系统自带的 logrotate

CentOS 自带 logrotate,直接配就行。

第一步:写配置文件

vi /etc/logrotate.d/nginx

内容:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    notifempty
    create 0644 www www
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
    endscript
}

参数说明:

参数 说明
daily 按天切割
rotate 30 保留30天的日志
compress 压缩旧日志
notifempty 空文件不切割
missingok 日志文件不存在不报错

第二步:测试一下

logrotate -d /etc/logrotate.d/nginx

-d 是调试模式,不会真执行,看一下有没有报错。

第三步:立即执行一次

logrotate -f /etc/logrotate.d/nginx

方法二:自己写脚本

不想用 logrotate,自己写个 shell 脚本:

vi /root/nginx_log.sh

内容:

#!/bin/bash

LOG_PATH=/var/log/nginx
YESTERDAY=$(date -d "yesterday" +%Y%m%d)

cd $LOG_PATH

mv access.log access_$YESTERDAY.log
mv error.log error_$YESTERDAY.log

nginx -s reopen

加执行权限:

chmod +x /root/nginx_log.sh

加到 crontab,每天凌晨执行:

crontab -e

加一行:

0 0 * * * /root/nginx_log.sh

常见坑

坑1:切割后日志不写了

把日志文件改名了,Nginx 还往旧文件写。

原因: Nginx 打开的是文件句柄,改名后它不知道。

解决: 切割后要通知 Nginx 重新打开日志文件:

nginx -s reopen

坑2:旧日志没删,磁盘还是满的

配了切割,但旧日志还留着。

原因: 没配 rotate 参数。

解决: 加上 rotate 30,自动只保留30天。

坑3:压缩太占CPU

所有日志都压缩,CPU 飙高。

解决: 错峰压缩,比如凌晨3点再压缩,或者用 delaycompress 延迟一天再压缩。

坑4:日志权限不对

切割后新日志文件属主不对,Nginx 写不了。

解决: logrotate 配置里加 create 0644 www www。

总结

推荐用 logrotate,系统自带,不用自己维护脚本。

核心配置就这些:

/var/log/nginx/*.log {
    daily
    rotate 30
    compress
    postrotate
        /bin/kill -USR1 `cat /run/nginx.pid`
    endscript
}

记住: 切割完一定要通知 Nginx 重新打开日志文件,不然新日志不写。

遇到问题加QQ23979811 协助处理

标签: Nginx 运维 服务器 logrotate 日志切割