Nginx日志定时清理
工作中nginx的日志,会随着访问量而暴增,在线上环境运行久了,如果没有对应的进行清理,容易将磁盘空间直接占满,还会影响系统或程序的服务运行,因此需要进行定时定期清理,下面使用Crontab定时任务和shell脚本凌晨0点进行nginx日志文件备份压缩后清理,保留近七天,存在的问题欢迎指出。
1、baklog.sh 文件 (里面涉及到的路径根据自己的nginx实际路径修改)
#!/bin/sh
NGINX_DIR=/usr/local/nginx  #安装的nginx的根路径
NGINX_LOG_PATH=/usr/local/nginx/logs  #nginx存放日志路径
BAK_LOG_PATH=/usr/local/nginx/backup/logs #nginx存放备份日志路径
ACCESS_FILE_NAME=access.log  #要备份的日志名 访问日志
ERROR_FILE_NAME=error.log  #要备份的日志名 错误日志
ACCESS_FILE=$NGINX_LOG_PATH/$ACCESS_FILE_NAME  #访问日志:源文件全地址
ERROR_FILE=$NGINX_LOG_PATH/$ERROR_FILE_NAME  #错误日志:源文件全地址
BAK_TIME=`/bin/date +%Y%m%d%H%M`  #时间形式为这种202211281049 如果是凌晨12点执行用后面这段 /bin/date -d yesterday +%Y%m%d%H%M
DELETE_LOG_TIME=`/bin/date --days='8 days ago' +%Y%m%d` #凌晨十二点执行,保留近七天日志文件
ACCESS_BAK_NAME=$BAK_TIME-$ACCESS_FILE_NAME #访问日志:备份的文件名 202211281049-access.log
ERROR_BAK_NAME=$BAK_TIME-$ERROR_FILE_NAME #错误日志:备份的文件名 202211281049-error.log
ACCESS_BAK_FILE=$BAK_LOG_PATH/$ACCESS_BAK_NAME  #访问日志:备份文件全地址
ERROR_BAK_FILE=$BAK_LOG_PATH/$ERROR_BAK_NAME  #错误日志:备份文件全地址
echo $ACCESS_BAK_FILE
echo $ERROR_BAK_FILE
mv $ACCESS_FILE $ACCESS_BAK_FILE     #将日志移动到备份的地方
mv $ERROR_FILE $ERROR_BAK_FILE     #将日志移动到备份的地方
#压缩备份的日志 路径使用绝对路径
cd /usr/local/nginx/backup/logs
DELETE_LOG_PATH=${find ./ -name ${DELETE_LOG_TIME}* | sed 's#.*/##'}
#tar -zcvf $BAK_TIME-access.tar.gz $ACCESS_BAK_NAME #202211281049-access.tar.gz
#tar -zcvf $BAK_TIME-error.tar.gz $ERROR_BAK_NAME #202211281049-error.tar.gz
tar -zcvf $BAK_TIME-log.tar.gz *.log #202211281049-log.tar.gz
#判读是否有要删除的日志文件
if[[ -f "$DELETE_LOG_PATH" ]];
then
echo 'DELETE FILE NAME IS ' $DELETE_LOG_PATH
rm -f $DELETE_LOG_PATH
fi
#重载nginx 生成新的access.log
$NGINX_DIR/sbin/nginx -s reload
#压缩完把原文件删除
rm -f $ACCESS_BAK_FILE
rm -f $ERROR_BAK_FILE
2、Crontab配置
工具  crontab
* * * * * /usr/local/nginx/baklog.sh
配置定时任务使用如下命令
crontab -e 
3、需要注意的问题
1、定时任务不执行(使用命令查看执行日志)
tail -f /var/log/cron
2、给baklog.sh可执行的权限
chmod 777 baklog.sh
3、建立好备份的文件夹