nginx自動切割訪問日志
Web 訪問日志 (access_log) 記錄了所有外部客戶端對Web服務器的訪問行為,包含了客戶端IP,訪問日期,訪問的URL資源,服務器返回的HTTP狀態碼等重要信息。
一條典型的Web訪問日志如下:
112.97.37.90 - - [14/Sep/2013:14:37:39 +0800] "GET / HTTP/1.1" 301 5 "-" "Mozilla/5.0 (Linux; U; Android 2.3.6; zh-cn; Lenovo A326 Build/GRK39F) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 MicroMessenger/4.5.1.259" -
規劃:
1、 要解決問題:
當網站訪問量大后,日志數據就會很多,如果全部寫到一個日志文件中去,文件會變得越來越大。文件大速度就會慢下來,比如一個文件幾百兆。寫入日志的時候,會影響操作速度。另外,如果我想看看訪問日志,一個幾百兆的文件,下載下來打開也很慢。使用第三方免費的日志分析工具-日志寶,可以上傳nginx、apache、iis的日志文件,它們幫助分析網站安全方面。畢竟專攻,更加專業。日志寶對上傳的文件也是做了大小限制的,不超過50m。
2、nignx沒有自動分開文件存儲日志的機制。由于nginx它不會幫你自動分文件保存。所以,需要自己編寫腳本來實現。
shell腳本文件nginx_log_division.sh內容如下:
# /bin/bash
logs_path="/data/wwwlogs/"
#以前的日志文件。
log_name="xxx.log"
pid_path="/usr/local/nginx/logs/nginx.pid"
mv ${logs_path}${log_name} ${logs_path}${log_name}_$(date --date="LAST WEEK" +"%Y-%m-d").log
kill -USR1 `cat ${pid_path}`
上面shell腳本的原理是:先把以前的日志文件移動重命名成一個,目的是就是備份。
按照上個周一的本日來命名,運行腳本的時候時間點是”2013-09-16”,那么生成文件名稱是”xxx.log_ 20130909.log”。
在沒有執行kill -USR1 `cat ${pid_path}`之前,即便已經對文件執行了mv命令而改變了文件名稱,nginx還是會向新命名的文件” xxx.log_ 20130909”照常寫入日志數據的。原因在于:linux系統中,內核是根據文件描述符來找文件的。