温馨提示×

linux下怎么切割nginx日志

小樊
47
2026-10-05 14:04:15
栏目: 智能运维

在 Linux 下切割 Nginx 日志,常见做法有 logrotate(推荐)、手动脚本 + kill -USR1、Nginx 自带功能(有限)。下面按常用程度说明。


一、使用 logrotate(最推荐 ✅)

大多数 Linux 发行版都自带 logrotate,Nginx 通常也会自带配置。

1. 查看已有配置

cat /etc/logrotate.d/nginx

常见内容示例:

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

2. 参数说明

  • daily:每天切割
  • rotate 14:保留 14 份
  • compress:压缩旧日志
  • notifempty:空日志不切割
  • kill -USR1:通知 Nginx 重新打开日志文件

3. 手动测试

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

二、手动脚本 + USR1 信号(适合自定义)

1. 切割脚本示例

#!/bin/bash

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

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

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

2. 加入定时任务

crontab -e
0 0 * * * /usr/local/bin/cut_nginx_log.sh

三、Nginx 本身不擅长“按大小/时间切割”

Nginx 不会自动切割日志,只能:

  • 写固定文件
  • 通过 kill -USR1 重新打开日志

所以必须配合外部工具。


四、常见问题

1. 切割后日志不写新文件?

✅ 必须执行:

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

2. 权限问题?

确保:

  • 脚本用户能访问日志目录
  • Nginx 用户有写权限

3. 想按大小切割?

logrotate 支持:

size 100M

或

daily

五、推荐方案总结

✅ 生产环境:logrotate
✅ 特殊需求:自定义脚本 + crontab
❌ 不建议依赖 Nginx 自身

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

  • 系统(CentOS / Ubuntu)
  • Nginx 安装方式(源码 / 包管理)
  • 是否 Docker

我可以给你一份可直接用的配置。

0 踩