Nginx日志的指令主要有兩條:
log_format,設置日志的格式
access_log,指定日志文件的存放路徑、格式和緩存大小
兩條指令在Nginx配置文件中的位置可以在http{……..}之間,也可以在虛擬主機之間,即server(…….)兩個大括號之間。
log_format 語法如下:
log_format name format [format …]
name表示定義的格式名稱(name名稱在Nginx配置文件中是不能重復的)
format表示定義的格式樣式。log_format有一個默認的、無須設置的combined日志格式設置
如上圖:Nginx服務器不能獲取到客戶端的真實IP地址。
原因:由於在客戶端和Web服務器之間增加了中間層(比如反向代理服務器),因此Web服務器無法直接拿到客戶端的lP,通 過$remote_addr變量拿到的將是反向代理服務器的IP地址。但是,反向代理服務器在轉發請求的HTTP頭信息中,可以增加X- Forwarded-For信息,用以記錄原有的客戶端lP地址和原來客戶端請求的服務器地址。
這時候,就要用log_format指令來設置日志格式,讓日志記錄X-Forwarded-For信息中的lP地址,即客戶的真實IP。例如,創建一個 名為mylogformat的日志格式,再用$http_x_forwarded_for變量記錄用戶的X-Forwarded-For lP地址:

access_log 語法如下
access_log path [format [buffer=size | off ] ]
其中path表示日志文件的存放路徑,format表示使用log_format指令設置的日志格式的名稱,buffer=size表示設置內存緩沖區的大小,例如可以設置buffer=32k。
(1)如果不想記錄日志,可以使用以下指令關閉日志記錄:
access_log off
(2)如果想使用默認的combined格式的日志記錄,可以使用以下示例:
access_log /data1/logs/filename.log
或者
access_log /data1/logs/filename.log combined;
(3)如果想使用自定義格式的日志記錄,可以使用以下示例,其中的mylogformat是日志格式名稱:
(4)在Nginx 0.7.4之后的版本中,access_log指令中的日志文件路徑可包含變量,例如:
access_log /data1/logs/$server_name.log combined;
nginx日志文件的切割
生產環境中的服務器,由於訪問日志文件增長速度非常快,日志太大會嚴重影響服務器效率。同時,為了方便對日志進行分析計算,須要對日志文件進行定時切割。定時切割的方式有按月切割、按天切割、按小時切割等。最常用的是按天切割。
Nginx不支持像Apache 一樣使用cronolog來輪轉日志,但是可以采用以下方式來實現日志文件的切割:
mv /data1/logs/access.log /data1/logs/20111030.log
kill -USR1 Nginx主進程號
通過mv命令將日志文件重命名為/data1/logs/20111030.log,然后發送kill -USR1信號給Nginx的主進程號,讓Nginx重新生成一個新的日志文件/data1/logs/access.log。
如果想每天定時切割日志,還須要借助crontab。我們可以寫一個按天切割的日志,按年、月
份目錄存放日志的shell腳本:
vi /usr/local/webserver/nginx/sbin/cut_nginx_log.sh
輸入以下內容並保存:

另外,配置crontab每天凌晨00:00定時執行這個腳本:
crontab –e
輸入以下內容並保存:
在很多時候,我們會非常關注網站的訪問量,比如網站的日PV是多少、網站某個功能上線之后點擊量是多少,像這些東西都是需要從web容器中的訪問日志統計出來的,下面我們看一下如何在nginx中統計網站的訪問信息
1、設置Nginx訪問日志記錄格式
在默認情況下,nginx只是記錄相關get信息,像post頁面是不記錄的,所以下面需要修改nginx.conf,讓其訪問日志記錄post等請求信息,在nginx.conf中server段中加入如下信息
log_format access '$remote_addr - $remote_user [$time_local] "$request"' '$status $body_bytes_sent "$http_referer"' '"$http_user_agent" $http_x_forwarded_for';
access_log /usr/local/nginx/logs/access.log access;
2、設置日志定期截取
設 置日志定期截取一是為了方便查閱,二是為了I/O擁塞(截止到目前筆者維護過的服務器中單台服務器日訪問日志大小就達到1.6G,如果不定期截取,由於文 件內容較大,后期對文件進程查詢、移動時將會嚴重影響系統性能)。nginx日志格式不像apache、resin那么人性化,nginx訪問日志無法在 nginx的配置文件中設置成按日期格式存儲,目前常見的設置方法主要靠第三方工具或者腳本來實現,下面我們就通過一個最簡單的腳本進行實現
#vi /etc/nginx_access_log.sh
#!/bin/bash
mv /usr/local/nginx/logs/access.log /opt/nginx_access_`date +%Y%m%d`.log
killall -s USR1 nginx
腳本說明:這個腳本主要實現兩個功能,一是將nginx訪問日志按照日期移動到目的地,而是移動完畢后讓nginx重新生成日志文件
#chmod +x /etc/nginx_access_log.sh
使用cron服務定期執行該腳本,下面設置成的是每晚23點59執行,這樣nginx訪問日志正好記錄的是全天的訪問記錄
#crontab -e
59 23 * * * /etc/nginx_access_log.sh
3、日志查詢
下面做一個最簡單的統計,統計http://blog.luwenju.com頁面的日點擊量是多少
#grep -c 'http://blog.luwenju.com/' /opt/nginx_access_20110815.log
396
總結:像本篇文章所介紹的統計方法只適合訪問量較小、應用相對簡單的網站,像復雜應用、訪問量較大的網站還需要借助第三方工具來統計,目前應用最廣泛的是awstats,《Nginx日志分析(下)》將介紹如何使用awstats來分析nginx日志
http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=3582157
第一步,日志的處理。
最好每天分割一下日志,一開始沒注意這個工作,結果不久日志文件就上G了,很痛苦。分割日志很簡單,首先把日志文件復制到別的地方,然后再通知nginx重新生成日志就可以了。shell腳本如下:
logs_path = " /nginx/logs/ "
mv ${logs_path}access . log ${logs_path}access_$(date - d " yesterday " + " %Y%m%d " ) . log
kill - USR1 `cat / nginx / logs / nginx . pid`
代碼中的/nginx/logs指的是nginx的log日志文件所在目錄,生成了以昨天日期命名的日志文件。
為了達到每天自動分割的目的,在crontab中加入以下部分:
這樣就每天的0點1分把nginx日志重命名為日期格式,並重新生成今天的新日志文件。
這個意思是要去讀取nginx昨天的日志文件,關於后邊%YYYY-0%MM-0%DD-24的設置,規則如下:
# depending on date or time (Replacement is made by AWStats at the beginning
# of its execution). This is available tags :
# %YYYY-n is replaced with 4 digits year we were n hours ago
# %YY-n is replaced with 2 digits year we were n hours ago
# %MM-n is replaced with 2 digits month we were n hours ago
# %MO-n is replaced with 3 letters month we were n hours ago
# %DD-n is replaced with day we were n hours ago
# %HH-n is replaced with hour we were n hours ago
# %NS-n is replaced with number of seconds at 00:00 since 1970
# %WM-n is replaced with the week number in month (1-5)
# %Wm-n is replaced with the week number in month (0-4)
# %WY-n is replaced with the week number in year (01-52)
# %Wy-n is replaced with the week number in year (00-51)
# %DW-n is replaced with the day number in week (1-7, 1=sunday)
# use n=24 if you need (1-7, 1=monday)
# %Dw-n is replaced with the day number in week (0-6, 0=sunday)
# use n=24 if you need (0-6, 0=monday)
# Use 0 for n if you need current year, month, day, hour
第三步,開始分析、生成結果。
這個命令會把結果生成到/var/lib/awstats 目錄下 awstatsXXXX.www.XXXX.com.txt文件。
當然啦,這樣看起來不太方便哦,呵呵,可以再用下面的命令來生成html頁面,相當漂亮:
perl /usr/local/awstats/tools/awstats_buildstaticpages.pl -update \
-config=www.xxxxoke.com -lang=cn \
-dir=/html/awstats \
-awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl
這樣就會在/html/awstats目錄下生成很漂漂的分析結果頁,很暴力很強大。
第四步,自動化。
要是每天都去服務器上運行幾條命令肯定是件令人煩燥的事情,所以呢,linux的世界里有crontab這樣的好東東,很簡單,下面是我的crontab
0 1 * * * / usr / local / awstats / wwwroot / cgi - bin / awstats . pl - update - config = www . xxxxke . com
0 2 * * * perl / usr / local / awstats / tools / awstats_buildstaticpages . pl - update - config = www . xxxxke . com - lang = cn - dir =/ html / awstats - awstatsprog =/ usr / local / awstats / wwwroot / cgi - bin / awstats . pl
-------------------------------------------------------------------------
大功告成,打完收功……
http://www.cnblogs.com/amboyna/archive/2009/08/09/1542171.html





