温馨提示×

linux如何切割nginx日志

小樊
37
2026-09-05 17:48:16
栏目: 智能运维

在 Linux 下对 Nginx 日志进行切割,常见做法有以下几种,从最推荐手动方案依次说明。


一、最推荐:使用 logrotate(系统自带,自动化)

1. 编辑或新建 logrotate 配置

通常 Nginx 已自带配置:

/etc/logrotate.d/nginx

如果没有,可新建:

vim /etc/logrotate.d/nginx

示例配置:

/var/log/nginx/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 0640 nginx nginx
    sharedscripts
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

2. 手动测试

logrotate -d /etc/logrotate.d/nginx   # 模拟执行
logrotate -f /etc/logrotate.d/nginx   # 强制执行

✅ 优点:

  • 系统级定时任务(每天自动执行)
  • 支持压缩、保留天数
  • 不需要自己写脚本

二、手动切割(shell 脚本 + crontab)

1. 编写脚本

vim /usr/local/bin/cut_nginx_log.sh

内容:

#!/bin/bash

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

mv $LOG_PATH/access.log $LOG_PATH/access.log-$DATE
mv $LOG_PATH/error.log $LOG_PATH/error.log-$DATE

# 通知 nginx 重新打开日志
kill -USR1 $(cat /var/run/nginx.pid)

# 压缩旧日志(可选)
gzip $LOG_PATH/access.log-$DATE
gzip $LOG_PATH/error.log-$DATE

赋予执行权限:

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

2. 加入定时任务

crontab -e

每天 0 点执行:

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

三、按小时 / 大小切割(进阶)

按小时

DATE=$(date +%Y-%m-%d-%H)

按大小(配合 logrotate)

size 100M

四、关键原理说明(非常重要)

Nginx 不会自动新建日志文件,必须通过:

kill -USR1 `cat /var/run/nginx.pid`

通知 Nginx 重新打开日志文件,否则还会写入旧文件。


五、常见坑

❌ 直接 rm 日志 → 磁盘不释放
❌ 忘了 kill -USR1 → 日志写不进去
❌ 权限错误 → nginx 无法写新日志


总结建议

场景 推荐方式
生产环境 ✅ logrotate
自定义逻辑 shell + crontab
简单测试 手动 mv + USR1

如果你愿意,我可以:

  • 帮你写 适合你 Nginx 路径的完整配置
  • 或帮你 排查当前日志不轮转的问题

直接把你的 Nginx 日志路径贴出来即可。

0