天天看點

Linux下定時切割nginx日志并删除指定天數前的日志記錄

nginx的log日志分為access.log和error.log;其中access.log 記錄了哪些使用者、哪些頁面以及使用者浏覽器、ip和其他的通路資訊;error.log則是記錄伺服器錯誤日志.

error.log日志的形式如下:

1

2

<code>201.158.69.116 - - [03</code><code>/Jan/2013</code><code>:21:17:20 -0600] fwf[-] tip[-] 127.0.0.1:9000 0.007 0.007 MX pythontab.com GET </code><code>/html/test</code><code>.html HTTP</code><code>/1</code><code>.1 </code><code>"200"</code> <code>2426 </code><code>"http://a.com"</code> <code>"es-ES,es;q=0.8"</code> <code>"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"</code>

<code>187.171.69.177 - - [03</code><code>/Jan/2013</code><code>:21:17:20 -0600] fwf[-] tip[-] 127.0.0.1:9000 0.006 0.006 MX pythontab.com GET </code><code>/html/test2</code><code>.html HTTP</code><code>/1</code><code>.1 </code><code>"200"</code> <code>2426 </code><code>"http://a.com"</code> <code>"es-ES,es;q=0.8"</code> <code>"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11"</code>

從上面我們可以看出幾部分資訊:

1.用戶端(使用者)IP位址。如:上例中的 201.158.69.116

2.通路時間。如:上例中的 [03/Jan/2013:21:17:20 -0600]

3.通路端口。如:上例中的 127.0.0.1:9000

4.響應時間。如:上例中的 0.007

5.請求時間。如:上例中的 0.007

6.使用者地理位置代碼(國家代碼)。如:上例中的 MX(墨西哥)

7.請求的url位址(目标url位址)的host。如:上例中的 pythontab.com

8.請求方式(GET或者POST等)。如:上例中的 GET

9.請求url位址(去除host部分)。如:上例中的 /html/test.html

10.請求狀态(狀态碼,200表示成功,404表示頁面不存在,301表示永久重定向等,具體狀态碼可以在網上找相關文章,不再贅述)。如:上例中的 "200"

11.請求頁面大小,預設為B(byte)。如:上例中的 2426

12.來源頁面,即從哪個頁面轉到本頁,專業名稱叫做“referer”。如:上例中的 "http://a.com"

13.使用者浏覽器語言。如:上例中的 "es-ES,es;q=0.8"

14.使用者浏覽器其他資訊,浏覽器版本、浏覽器類型等。如:上例中的  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML,like Gecko) Chrome/23.0.1271.97 Safari/537.11"

access.log日志的格式不是一成不變的,是可以自定義的。在nginx的nginx.conf配置檔案找到:log_format 這裡就是日志的格式

3

4

5

<code>    </code><code>#log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '</code>

<code>    </code><code>#                  '$status $body_bytes_sent "$http_referer" '</code>

<code>    </code><code>#                  '"$http_user_agent" "$http_x_forwarded_for"';</code>

<code>    </code><code>#access_log  logs/access.log  main;</code>

log_format是Nginx的HttpLog子產品指令,用于指定Nginx日志的輸出格式。main為此日志輸出格式的名稱,可以在下面的access_log指令中引用。

eg:

<code>192.168.21.1 - - [27</code><code>/Jan/2014</code><code>:11:28:53 +0800] </code><code>"GET /2.php HTTP/1.1"</code> <code>200 133 </code><code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1707.0 Safari/537.36"</code> <code>"-"</code><code>192.168.21.128 200 127.0.0.1:9000 0.119 0.119</code>

$remote_addr:用戶端位址  192.168.21.1

$remote_user:用戶端使用者 -

$time_local:時間和時區   27/Jan/2014:11:28:53 +0800

$request:請求的URL路徑和HTTP協定   GET /2.php HTTP/1.1

$status: HTTP狀态  200

$body_bytes_sent:發送給用戶端頁面大小  133

$http_referer:頁面跳轉來源 -

$http_user_agent:使用者通路終端  Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1707.0 Safari/537.36

$http_x_forwarded_for:HTTP 代理中,請求端真實IP -

$http_host:使用者在浏覽器中輸入的URL(IP或着域名)位址  192.168.21.128

$upstream_status: upstream狀态    200

$upstream_addr: 後端upstream位址及端口  127.0.0.1:9000

$request_time: 頁面通路總時間  0.119

$upstream_response_time:頁面通路中upstream響應時間   0.119

這時候,就要用log_format指令來設定日志格式,讓日志記錄X-Forwarded-For資訊中的lP位址,即客戶的真實IP。例如,建立一個名為mylogformat的日志格式,再用$http_x_forwarded_for變量記錄使用者的X-Forwarded-For lP位址: 

<code>    </code><code>log_format  mylogformat  </code><code>'$http_x_forwarded_for - $remote_user [$time_local] "$request" '</code>

<code>                      </code><code>'$status $body_bytes_sent "$http_referer" '</code>

<code>                      </code><code>'"$http_user_agent" "$http_x_forwarded_for"'</code><code>;</code>

如果不想記錄日志,可以使用以下指令關閉日志記錄: 

<code> </code><code>access_log off</code>

nginx日志檔案的切割

生産環境中的伺服器,由于通路日志檔案增長速度非常快,日志太大會嚴重影響伺服器效率。同時,為了友善對日志進行分析計算,須要對日志檔案進行定時切割。定時切割的方式有按月切割、按天切割、按小時切割等。最常用的是按天切割。 

Nginx不支援像Apache 一樣使用cronolog來輪轉日志,但是可以采用以下方式來實作日志檔案的切割: 

mv /usr/local/nginx/logs/access.log /usr/local/nginx/logs/access_20150519084513.log 

kill -USR1 Nginx主程序号 

通過mv指令将日志檔案重命名為/usr/local/nginx/logs/access_20150519084513.log,然後發送kill -USR1信号給Nginx的主程序号,讓Nginx重新生成一個新的日志檔案/usr/local/nginx/logs/access.log。 

如果想每天定時切割日志,還須要借助crontab。我們可以寫一個按天切割的日志,按年、月份目錄存放日志的shell腳本: 

6

7

8

9

10

11

12

13

14

15

16

17

18

<code>[root@localhost logs]</code><code># vim /usr/local/nginx/sbin/cut_nginx_log.sh </code>

<code>#!/bin/bash</code>

<code>logs_path=</code><code>"/usr/local/nginx/logs/"</code>

<code>DAYS=30</code>

<code>mv</code> <code>${logs_path}access.log ${logs_path}access_$(</code><code>date</code> <code>-d </code><code>"yesterday"</code> <code>+</code><code>"%Y%m%d%H%M%S"</code><code>).log</code>

<code>#mv ${logs_path}access.log ${logs_path}access_$(date +"%Y年%m月%d日%H時%M分%S秒星期%w").log</code>

<code>#mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y年%m月%d日%H時%M分%S秒星期%w").log</code>

<code>kill</code> <code>-USR1 `</code><code>cat</code> <code>/usr/local/nginx/logs/nginx</code><code>.pid`</code>

<code>find</code> <code>${logs_path} -name </code><code>"access_*.log"</code> <code>-</code><code>type</code> <code>f -mtime +$DAYS -</code><code>exec</code> <code>rm</code> <code>{} \;</code>

<code>[root@localhost logs]</code><code># chmod +x /usr/local/nginx/sbin/cut_nginx_log.sh </code>

<code>[root@localhost logs]</code><code># crontab -e</code>

<code>0 0 * * * </code><code>/usr/local/nginx/sbin/cut_nginx_log</code><code>.sh     </code>

<code>[root@localhost logs]</code><code># service crond restart</code>

<code>Stopping crond:                                            [  OK  ]</code>

<code>Starting crond:                                            [  OK  ]</code>

<code>[root@localhost logs]</code><code># chkconfig crond on</code>

<code>[root@localhost logs]</code><code>#</code>

如果腳本在執行過程中出現下面錯誤

<code>nginx: [error] </code><code>open</code><code>() "</code><code>/usr/local/nginx/logs/nginx</code><code>.pid" failed</code>

解決辦法:

<code>[root@localhost logs]</code><code># /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf</code>

<code></code>

本文轉自 justin_peng 51CTO部落格,原文連結:http://blog.51cto.com/ityunwei2017/1653088,如需轉載請自行聯系原作者

繼續閱讀