自己部署的个人服务器,主要使用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 编辑器。

检查脚本语法是否正确-
bash -n /opt/u01/exam/nginx/nginx_rotate.sh

.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.服务器测试效果,完全可行。

查看具体日志

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