===============================================
2019/4/6_第2次修改 ccb_warlock
2019/4/6:修復原先腳本無法正確保存日志的問題;
===============================================
配置了記錄日志的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