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,如需轉載請自行聯系原作者