Nginx日志切割

自己部署的个人服务器,主要使用Nginx服务器来做转发和展示很多的静态页面内容,因此每天的日志还是比较多。

日志多了之后,不可能所有的日志都放在同一个文件中,这时候,就需要考虑日志切割,自己是准备按照天保存。

然后跟着千问提供的方案,一步一步地完成了日志切割,主要使用的是定时脚本。

 

.1.创建脚本(宿主机)

nano /opt/u01/exam/nginx/nginx_rotate.sh

 

.2.脚本内容如下-自己使用docker-compose来进行部署,因此脚本也是围绕该部署方式来写的

#!/bin/bash

 

# ======================

# Nginx Docker 日志按天切割脚本(适用于 docker-compose 部署)

# 功能:切割 access.log / error.log,通知 Nginx 重开日志,清理旧日志

# 作者:根据用户需求定制

# ======================

 

# --- 配置区(请根据实际情况修改)---

LOG_DIR="/xxx/exam/nginx/log"                # 宿主机挂载的 Nginx 日志目录

COMPOSE_FILE="/xxx/exam/docker-compose.yml"  # docker-compose.yml 的绝对路径

NGINX_SERVICE="nginx"                            # docker-compose 中 Nginx 服务名

RETAIN_DAYS=60                                   # 保留日志天数

LOG_OUTPUT="/var/log/nginx_rotate.log"           # 脚本自身运行日志(可选)

 

# --- 日志函数 ---

log() {

    local msg="[ $(date '+%Y-%m-%d %H:%M:%S') ] $*"

    echo "$msg" | tee -a "$LOG_OUTPUT" >&2

}

 

# --- 主逻辑 ---

log "开始执行 Nginx 日志切割任务..."

 

YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

 

# 1. 切割 access.log

if [ -f "${LOG_DIR}/access.log" ]; then

    mv "${LOG_DIR}/access.log" "${LOG_DIR}/access_${YESTERDAY}.log"

    log "已切割 access.log → access_${YESTERDAY}.log"

else

    log "警告:${LOG_DIR}/access.log 不存在,跳过切割"

fi

 

# 2. 切割 error.log

if [ -f "${LOG_DIR}/error.log" ]; then

    mv "${LOG_DIR}/error.log" "${LOG_DIR}/error_${YESTERDAY}.log"

    log "已切割 error.log → error_${YESTERDAY}.log"

else

    log "警告:${LOG_DIR}/error.log 不存在,跳过切割"

fi

 

# 3. 通知 Nginx 重开日志文件

sent_signal=false

 

# 尝试使用 docker compose(新版 Docker 内置)

if command -v docker >/dev/null && docker compose version >/dev/null 2>&1; then

    if docker compose -f "$COMPOSE_FILE" kill -s HUP "$NGINX_SERVICE" 2>/dev/null; then

        log "已通过 'docker compose' 向服务 '$NGINX_SERVICE' 发送 HUP 信号"

        sent_signal=true

    fi

fi

 

# 回退到 docker-compose(独立命令)

if [ "$sent_signal" = false ] && command -v docker-compose >/dev/null; then

    if docker-compose -f "$COMPOSE_FILE" kill -s HUP "$NGINX_SERVICE" 2>/dev/null; then

        log "已通过 'docker-compose' 向服务 '$NGINX_SERVICE' 发送 HUP 信号"

        sent_signal=true

    fi

fi

 

# 如果两种方式都失败

if [ "$sent_signal" = false ]; then

    log "错误:无法向 Nginx 发送 HUP 信号,请检查 Docker 环境或服务名"

    exit 1

fi

 

# 4. 清理超过 RETAIN_DAYS 天的日志

log "开始清理 ${RETAIN_DAYS} 天前的日志..."

find "${LOG_DIR}" -name "access_*.log" -mtime +$((RETAIN_DAYS)) -delete 2>/dev/null

find "${LOG_DIR}" -name "error_*.log" -mtime +$((RETAIN_DAYS)) -delete 2>/dev/null

log "日志清理完成"

 

log "Nginx 日志切割任务成功结束"

 

编辑方式-

打开脚本:nano /opt/u01/exam/nginx/nginx_rotate.sh

直接粘贴 / 修改内容(无需切换模式);

编辑完成后,按 Ctrl+O(字母 O) → 提示 “File Name to Write”,直接回车确认保存;

再按 Ctrl+X 退出 nano 编辑器。

image

 

 

检查脚本语法是否正确-

bash -n /opt/u01/exam/nginx/nginx_rotate.sh

image

 

 

.3.设置权限+定时任务

sudo chmod +x /opt/u01/exam/nginx/nginx_rotate.sh

 

sudo crontab -e

添加-

0 1 * * * /opt/u01/exam/nginx/nginx_rotate.sh  # 每天凌晨1点执行

 

.4.服务器测试效果,完全可行。

image

 查看具体日志

image

 

感谢千问 大模型。只能能够描述出具体的IT需求,它就能给我提供一个好的思路,还有就是辅助写代码。

 

posted @ 2025-12-09 23:08  一只爱阅读的程序员  阅读(22)  评论(0)    收藏  举报