温馨提示×

Debian怎样切割Nginx日志

小樊
37
2026-07-13 10:25:15
栏目: 智能运维

在 Debian 上切割 Nginx 日志,常见且推荐的做法有 两种
使用 logrotate(官方推荐,最常用)
使用自定义脚本 + cron(更灵活)

下面分别说明,并给出可直接使用的配置示例。


一、使用 logrotate(推荐 ✅)

Debian 默认已安装 logrotate,Nginx 通常也会自带配置。

1️⃣ 查看已有配置

ls /etc/logrotate.d/nginx

内容通常类似:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 7
    compress
    delaycompress
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        systemctl reload nginx > /dev/null 2>&1
    endscript
}

2️⃣ 常见参数说明

参数 含义
daily 每天切割
rotate 7 保留 7 份
compress 压缩旧日志
missingok 日志不存在不报错
notifempty 空日志不切割
postrotate 切割后执行(重载 Nginx)

3️⃣ 修改为你自己的需求(示例)

假设你只想:

  • 每天切割
  • 保留 30 天
  • 不压缩
/var/log/nginx/*.log {
    daily
    rotate 30
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        systemctl reload nginx
    endscript
}

保存后测试:

logrotate -d /etc/logrotate.d/nginx

强制立即执行:

logrotate -f /etc/logrotate.d/nginx

二、使用自定义脚本 + cron(适合特殊需求)

1️⃣ 创建切割脚本

vim /usr/local/bin/cut_nginx_log.sh

内容示例:

#!/bin/bash

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

for log in access.log error.log; do
    mv ${LOG_PATH}/${log} ${LOG_PATH}/${log}.${DATE}
done

# 重新打开日志文件
systemctl reload nginx

赋予执行权限:

chmod +x /usr/local/bin/cut_nginx_log.sh

2️⃣ 加入 cron

crontab -e

每天凌晨 0 点执行:

0 0 * * * /usr/local/bin/cut_nginx_log.sh

三、为什么一定要 reload Nginx?

Nginx 使用 文件描述符 写日志,直接 mv 后:

  • 旧日志仍在写入
  • 新日志不会自动创建

reload 或:

kill -USR1 $(cat /var/run/nginx.pid)

可以让 Nginx 重新打开日志文件。


四、推荐方案总结

场景 推荐方式
普通服务器 ✅ logrotate
多站点 / 自定义规则 脚本 + cron
Docker / 容器 脚本或日志驱动

如果你愿意,可以告诉我:

  • 是否 多站点
  • 是否 按小时切割
  • 是否 Docker / Kubernetes

我可以帮你定制一套最合适的 Nginx 日志切割方案。

0