背景
nginx的日志文件沒有rotate功能。一段時間過后,日志將越發臃腫,一個accesslog很快就突破1G,因此有必要通過腳本實現按天切割日志。
解決思路
1 重命名日志文件,如更改為access_yyyyMMdd.log,需注意的是nginx通過文件描述符定位日志文件,因此在重命名之后還是能往該文件內寫入內容。
2 向nginx主進程發送USR1信號。
nginx的master進程接到信號后:
重新從配置文件中讀取日志文件名 -> 關閉重名日志文件 -> 創建並打開日志文件(原來的名稱) -> 通過worker進程作出改變
代碼實現
A. nginx日志按日期自動切割腳本
#author: http://www.nginx.cn #!/bin/bash #日志文件存放目錄 logs_path="/usr/local/nginx/logs/" # pid文件 pid_path="/usr/local/nginx/nginx.pid" #重命名日志文件 mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log #向nginx主進程發送信號以重新打開日志 kill -USR1 `cat ${pid_path}
保存為 cut-log.sh,
B. 設置定時任務 "crontab -e"
0 0 * * * bash /usr/local/nginx/nginx_log.sh
其他實現
通過apache的rotate程序 + 命名管道的方式