nginx 日志切割
配置了记录日志的nginx,在运行较长时间后,产生的日志文件(access.log)会越来越大。
日志文件过大会带来下面的问题:
- 查询过大的日志文件对于开发和运维十分不方便,特别是加班人很累的情况下更加雪上加霜;
- 很久以前的日志文件几乎没有价值,但是手工清理又太过繁琐;
这时候就需要一种解决方案可以自动来做日志分割,分割后的日志不仅“干净”,也便于实现日志定时清理。
由于目前的nginx使用docker部署,而公司的业务大都需要nginx始终运行,网上的“停nginx,分割,重启nginx”的方案并不适合,故对网上的方案进行了改进,使得目前的方案也能适应业务运行要求。
一、前提条件
- 本次部署docker的基础os选择centos 7
- 本次通过swarm的stack方式部署了nginx容器(https://www.cnblogs.com/straycats/p/9388219.html)
- 本次nginx容器的日志文件持久化在宿主机的目录(/usr/docker-vol/nginx/logs)下
- 本次每天0:00做日志切割,将切割后的日志文件(access.log、error.log)存放在宿主机的目录(/usr/docker-vol/nginx/logs-bak)下
-
期望的日志备份目录结构:
1级目录:4位年-2位月
2级目录:4位年-2位月-2位日
3级目录:存放切割后备份的日志文件
二、配置nginx容器的日志切割
2.1 编辑cutlogs.sh
mkdir -p /opt/sh vi /opt/sh/cutlogs.sh
# 将下面的内容添加到cutlogs.sh内,wq保存。
#!/bin/bash # 指定日志和切割后日志备份的目录 YEAR=$(date +%Y) MONTH=$(date +%m) DAY=$(date +%d) YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) LOGS_PATH=/usr/docker-vol/nginx/logs LOGS_BAK_PATH=/usr/docker-vol/nginx/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}/admin_access.log ${LOGS_BAK_PATH}/${YESTERDAY}/admin_access_${YESTERDAY}.log cp ${LOGS_PATH}/error.log ${LOGS_BAK_PATH}/${YESTERDAY}/error_${YESTERDAY}.log # 清空日志 > ${LOGS_PATH}/access.log > ${LOGS_PATH}/admin_access.log > ${LOGS_PATH}/error.log
2.2 给cutlogs.sh增加权限
chmod 777 /opt/sh/cutlogs.sh
PS.在创建定时任务之前,可以用下面的命令先试验脚本是否存在问题
bash /opt/cutlogs.sh
三、创建定时任务
3.1 编辑crontab
vi /etc/crontab
# 将下面的内容添加到crontab文件中,wq保存。
# 每天0:00执行该脚本 0 0 * * * root bash /opt/sh/cutlogs.sh
3.2 重启crontab
systemctl restart crond
根据这个方案切割后的日志文件会根据这样的结构进行存放。
后话:
不停机做日志切割可能会出现日志记录丢失的情况(即拷贝走、清空源文件之间会有时间间隔),但是对于目前的业务,一天的日志信息量不大且丢失的日志对于整天的日志来说犹如沧海一粟,故现在先用这个方案来解决docker部署后的nginx日志切割。
参考资料:
1.http://www.cnblogs.com/wjoyxt/p/4757093.html
2.https://blog.csdn.net/linglongwunv/article/details/5212700
3.http://www.cnblogs.com/wjoyxt/p/4757093.html
4.https://www.cnblogs.com/aaronLinux/p/7074725.html