nginx 日誌切割(也適用於docker)
===============================================
2018/11/11_第1次修改 ccb_warlock
===============================================
配置了記錄日誌的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)下
二、配置nginx容器的日誌切割
2.1 編輯cut-nginxlogs.sh
mkdir -p /opt/sh
vi /opt/sh/cut-nginxlogs.sh
# 將下面的內容新增到cut-nginx.sh內,wq儲存。
# 指定日誌和切割後日志備份的目錄 YEAR=$(date +%Y) MONTH=$(date +%m) YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) LOGS_PATH=/usr/docker-vol/nginx/logs LOGS_BAK_PATH=/usr/docker-vol/nginx/logs-bak/${YEAR}-${MONTH} # 建立目錄 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 給cut-nginxlogs.sh增加許可權
chmod 777 /opt/sh/cut-nginxlogs.sh
三、建立定時任務
3.1 編輯crontab
vi /etc/crontab
# 將下面的內容新增到crontab檔案中,wq儲存。
# 每天0:00執行該指令碼 0 0 * * * root bash /opt/sh/cut-nginxlogs.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