Nginx 日志切割 [转载]
配置了记录日志的nginx,在运行较长时间后,产生的日志文件(access.log)会越来越大。
日志文件过大会带来下面的问题:
- 查询过大的日志文件对于开发和运维十分不方便,特别是加班人很累的情况下更加雪上加霜;
- 很久以前的日志文件几乎没有价值,但是手工清理又太过繁琐;
这时候就需要一种解决方案可以自动来做日志分割,分割后的日志不仅“干净”,也便于实现日志定时清理。
由于目前的nginx使用docker部署,而公司的业务大都需要nginx始终运行,网上的“停nginx,分割,重启nginx”的方案并不适合,故对网上的方案进行了改进,使得目前的方案也能适应业务运行要求。
一、前提条件
-
本次部署docker的选择centos 7
-
本次nginx容器的日志文件持久化在宿主机的目录(/usr/local/docker/nginx_docker/logs)下
-
本次每天0:00做日志切割,将切割后的日志文件(access.log、error.log)存放在宿主机的目录(/usr/local/docker/nginx_docker/logs-bak)下
-
期望的日志备份目录结构:
1级目录:4位年-2位月
2级目录:4位年-2位月-2位日
3级目录:存放切割后备份的日志文件
二、配置nginx切割日志
2.1 编辑div_nginx_log.sh
#在/usr/local/docker/nginx_docker目录下
touch div_nginx_log.sh
然后vim div_nginx_log.sh
#!/bin/bash
# 指定日志和切割后日志备份的目录
YEAR=$(date +%Y)
MONTH=$(date +%m)
DAY=$(date +%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
LOGS_PATH=/usr/local/docker/nginx_docker/logs
LOGS_BAK_PATH=/usr/local/docker/nginx_docker/logs-bak
# 得到1级目录名
if [[ $(($DAY)) -eq 1 ]]
then
if [[ $(($MONTH)) -eq 1 ]]
then
LOGS_BAK_PATH=$LOGS_BAK_PATH/$((${YEAR}-1))-12
else
if [[ $(($MONTH)) -gt 10 ]]
then
LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-$((${MONTH}-1))
else
LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-0$((${MONTH}-1))
fi
fi
else
LOGS_BAK_PATH=$LOGS_BAK_PATH/${YEAR}-${MONTH}
fi
# 创建目录
mkdir -p $LOGS_BAK_PATH/${YESTERDAY}
# 复制当前的日志文件到备份的目录
cp ${LOGS_PATH}/access.log ${LOGS_BAK_PATH}/${YESTERDAY}/access_${YESTERDAY}.log
cp ${LOGS_PATH}/error.log ${LOGS_BAK_PATH}/${YESTERDAY}/error_${YESTERDAY}.log
# 清空日志
> ${LOGS_PATH}/access.log
> ${LOGS_PATH}/error.log
2.2 给bash添加执行权限
chmod 777 div_nginx_log.sh
测试脚本
bash div_nginx_log.sh
三、创建定时任务
vi /etc/crontab
将下面的内容添加到crontab文件中,wq保存。
# 每天0:00执行切割日志归档脚本
0 0 * * * root bash /usr/local/docker/nginx_docker/div_nginx_log.sh
重启crontab
systemctl restart crond