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命令。