nginx按时间切割

几个简单的切割脚本:
nginx日志按天进行切割,通过写shell脚本,创建以日期命名文件

#!/usr/bin/env bash

set -e
# 定义nginx 日志路径
LOG_PATH="/var/gb/logs/"

# 定义nginx 访问日志文件名称
ACCESS_LOG="access.log"
ERROR_LOG="error.log"

for i in `find  $LOG_PATH -name "$ACCESS_LOG"`; do
    cd $(dirname $i)
    # 切割access日志
    if [[ -f $ACCESS_LOG ]]; then
        cp {,$(date +%F)-}${ACCESS_LOG}
        : > $ACCESS_LOG
    fi
    
    # 如果error日志>20m,切
    if [[ -f $ERROR_LOG ]]; then
        ERROR_SIZE=`ls -l $ERROR_LOG | awk '{ print $5 }'`
        if [[ $ERROR_SIZE -gt 20971520 ]]; then
            cp {,$(date +%F)-}${ERROR_LOG}
            : > ${ERROR_LOG}
        fi
    fi
done

# 查找nginx 日志目录下7天前的日志并删除
find ${LOG_PATH} -type f -name "*-${ACCESS_LOG}" -mtime +7 -delete
find ${LOG_PATH} -type f -name "*-${ERROR_LOG}"  -mtime +7 -delete

其实上面的这个脚本是有点问题的。就是上面的cp命令,因此存在丢失日志的风险,可能就是那0.01秒的日志。

LOGS_PATH=/usr/local/nginx/logs/history
CUR_LOGS_PATH=/usr/local/nginx/logs
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mv ${CUR_LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log
mv ${CUR_LOGS_PATH}/error.log ${LOGS_PATH}/error_${YESTERDAY}.log
## 像nginx主进程发送USR1信号,USR1信号是重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

USR1是切割日志的,对应reopen命令。

posted @ 2020-07-22 16:02  峰哥ge  阅读(341)  评论(0编辑  收藏  举报