Nginx 日志按天分割


#nginx日志切割腳本

#!/bin/bash
#設置日志文件存放目錄
logs_path="/home/www.xxx.com/wwwlogs/"
#設置pid文件
pid_path="/usr/local/nginx/nginx.pid"

#重命名日志文件
mv ${logs_path}host.access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log

#向nginx主進程發信號重新打開日志
kill -USR1 `cat ${pid_path}`

1.新建sh腳本,命名為 nginx.log.sh

2.添加crontab定時任務

執行命令: crontab -e 在打開的文件中輸入

0 0 * * * bash /usr/local/nginx/nginx.log.sh

注意路徑修改位sh腳本放置的目錄。

3.查看定時任務是否添加成功。

命令:crontab -l

 

================================================================================

其他說明:

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內容如下: 

上面shell腳本的原理是:先把以前的日志文件移動重命名成一個,目的是就是備份。

按照上個周一的本日來命名,運行腳本的時候時間點是”2013-09-16”,那么生成文件名稱是”xxx.log_ 20130909.log”。

在沒有執行kill -USR1 `cat ${pid_path}`之前,即便已經對文件執行了mv命令而改變了文件名稱,nginx還是會向新命名的文件” xxx.log_ 20130909”照常寫入日志數據的。原因在於:linux系統中,內核是根據文件描述符來找文件的。

 

----------------對linux文件描述符的理解

文件描述符是linux內核為每個打開的文件命名的一個整數標識。

linux內核為每一個進程生成(或者說維護)一個”文件描述符表”,這個文件描述符表記錄的是“此進程所打開的文件(進行標識)”。

在這里的環境中,nginx就是一個運行中的進程,這個進程早就打開了一個日志文件,在文件描述符表是記錄了文件的。

即便日志文件的路徑改變了,但是還是能夠找到(根據文件描述符表可以定位)。

 ----------------------------------------------

當執行命令“kill -USR1 `cat ${pid_path}`”的時候,nginx.pid文件中保存的其實就是一個數字(自己可以打開看一下,我這里是894),nginx 將其主進程的 pid (進程號)寫入到了nginx.pid 文件中,所以可以通過cat命令直接拿到其主進程號,直接操作指定的進程號。

kill  -USR1 `cat ${pid_path}` 就等同於

kill –USR1 894  #指定發信號(USR1)信號給這個進程編號。

在linux系統中,linux是通過信號與”正在運行的進程”進行通信的。linux系統中,也很多預定義好的信號,像SIGHUP。USR1是用戶自定義信號。可以理解為:進程自己定義接到這個信號該干嘛(也就是進程編寫者自己確定收到這個信號干嘛還是什么都不做都行,完全交給開發人員自己決定)。而在nginx中,它自己編寫了代碼處理當我接到USR1信號的時候,讓nginx重新打開日志文件。具體原理如下:

1、nginx 的主進程收到USR1信號,會重新打開日志文件(以nginx配置文件中的日志名稱命名,就是配置文件中access_log項所設置的值,如果文件不存在,會自動創建一個新的文件xxx.log)。

2、然后把日志文件的擁有者改為“工作進程(worker進程)”,目的是讓worker進程就具備了對日志文件的讀寫權限(master和worker通常以不同用戶運行,所以需要改變擁有者)。

3、nginx主進程會關閉重名的日志文件(也就是剛才使用mv命令重命名成xxx.log_ 20130909.log的文件),並通知工作進程使用新打開的日志文件(剛才主進程打開的文件xxx.log)。具體實現上更細化點就是,主進程把USR1信號發給worker,worker接到這個信號后,會重新打開日志文件(也就是配置文件中約定的xxx.log)

===================================定時執行腳本

設置上面的shell腳本文件加入到定時任務中去。crontab是linux下面一個定時任務進程。開機此進程會啟動,它每隔一定時間會去自己的列表中看是否有需要執行的任務。

crontab  -e

* 04 * * 1 /data/wwwlogs/nginx_log_division.sh

會打開一個文件,加入上面的代碼

格式為 "分 時 日 月 星期幾  要執行的shell文件路徑"。用*可以理解成“每”,每分鍾,每個小時,每個月等等。

我設置是在周一凌晨4點運行nginx_log_division.sh腳本,腳本的內容就是重新生成一個新的日志文件。

 

附:設置nginx日志的配置方法

 

log_format  site  '$remote_addr - $remote_user [$time_local] "$request" '

             '$status $body_bytes_sent "$http_referer" '

             '"$http_user_agent" $http_x_forwarded_for';

 

access_log  /data/wwwlogs/xxxx.com.log  site

#第二個參數表示使用那個日志格式,為每一個日志格式標識了一個名稱,site對應的就是log_format中的名稱

 

以上涉及到crontab定時任務管理器的使用知識。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM