nginx access log日誌簡介

2021-08-27 11:40:40 字數 3160 閱讀 6317

nginx 日誌主要有兩條指令:1)log_format:用來設定日誌格式;2)access_log:用來指定日誌檔案的存放路徑、格式

log_format 日誌格式

1、語法:

log_format name(格式名字) 格式樣式(即想要得到什麼樣的日誌內容)

示例:

log_format main

2、具體引數格式

3、x_forwarded_for:

通常web伺服器放在反向**的後面,這樣就不能獲取到客戶的ip位址了,通過$remote_addr拿到的ip位址是反向**伺服器的ip位址。反向**伺服器在**請求的http頭資訊中,可以增加x_forwarded_for資訊,用以記錄原有客戶端的ip位址和原來客戶端的請求的伺服器位址。

注:在server中設定x_forwarded_for

proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
access_log

用了log_format 指令設定了日誌格式之後,需要用access_log指令指定日誌檔案的存放路徑;

1、語法:

access_log path(存放路徑) format (自定義日誌名稱)

示例:

access_log logs/access.log main;
2、設定刷盤策略:

access_log /data/logs/nginx-access.log buffer=32k flush=5s;
buffer 滿 32k 才刷盤;假如 buffer 不滿 5s 鐘強制刷盤。

注:一般log_format在全域性設定,可以設定多個。access_log 可以在全域性設定,但往往是定義在虛擬主機(server)中的location中。

例如:

http 

}}

3、其他:1)error_log:

配置錯誤日誌,例如上例。

2)open_log_file_cache:

對於每一條日誌記錄,都將是先開啟檔案,再寫入日誌,然後關閉。可以使用open_log_file_cache來設定日誌檔案快取(預設是off)。

語法:

open_log_file_cache max=n [inactive=time] [min_uses=n] [valid=time];
引數注釋如下:

open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;
3)日誌分析:

通過對日誌格式的定義,就可以使用常見的 linux 命令列工具進行分析了:

查詢訪問頻率最高的 url 和次數:

cat access.log | awk -f 『^a』 『』 | sort | uniq -c
查詢當前日誌檔案 500 錯誤的訪問:

cat access.log | awk -f 『^a』 『』
查詢當前日誌檔案 500 錯誤的數量:

cat access.log | awk -f 『^a』 『』 | wc -l

查詢某一分鐘內 500 錯誤訪問的數量:

cat access.log | awk -f 『^a』 『』 | grep 』09:00』 | wc-l
查詢耗時超過 1s 的慢請求:

tail -f access.log | awk -f 『^a』 『』
假如只想檢視某些位:

tail -f access.log | awk -f 『^a』 『』
查詢 502 錯誤最多的 url:

cat access.log | awk -f 『^a』 『』 | sort | uniq -c
查詢 200 空白頁

cat access.log | awk -f 『^a』 『』
切割日誌nginx 的日誌都是寫在乙個檔案當中的,不會自動地進行切割,如果訪問量很大的話,將導致日誌檔案容量非常大,不便於管理和造成nginx 日誌寫入效率低下等問題。所以,往往需要要對access_log、error_log日誌進行切割。

切割日誌一般利用usr1訊號讓nginx產生新的日誌。例項:

#!/bin/bashlogdir="/data/logs/nginx"

pid=`cat $logdir/nginx.pid`

date=`date -d "1 hours ago" +%y%m%d%h`

date_old=`date -d "7 days ago" +%y%m%d`

for i in `ls $logdir/*access.log`; do

mv $i $i.$date

done

for i in `ls $logdir/*error.log`; do

mv $i $i.$date

done

kill -s usr1 $pid

rm -v $logdir"/access.log."$date_old*rm -v $logdir"/error.log."$date_old*

1、分析:2、說明:在沒有執行kill -usr1 $pid之前,即便已經對檔案執行了mv命令而改變了檔名稱,nginx還是會向新命名的檔案」*access.log.2016032623」照常寫入日誌資料的。原因在於:linux系統中,核心是根據檔案描述符來找檔案的。

3、logrotates:

使用系統自帶的logrotates,也可以實現nginx的日誌分割,檢視其bash原始碼,發現也是傳送usr1這個訊號。

nginx access log 完全關閉

最近在配置本地nginx開發環境時,發現乙個問題,當server段不指定access log時,並且http段中也未指定任何 access log引數時,它會預設寫到logs access.log這個檔案,也就是access log預設值就是 logs access.log 而且是所有server的...

2007 09 22 日誌 轉折日

最近太忙了,忙到真的連看自己blog的時間都沒有了 更別提更新了 看著各種排名的全線飄綠 慘不忍睹,我的那個心啊,哇涼哇涼的啊 不過,忙碌的工作收穫也是巨大的 我們的團隊取得了驕人的成績!在此,我對團隊的每個成員表示衷心的感謝。我相信,中國的外包史上將銘刻這幾位同事的名字,他們是 成績歸成績,缺點也...

2007 09 22 日誌 轉折日

最近太忙了,忙到真的連看自己blog的時間都沒有了 更別提更新了 看著各種排名的全線飄綠 慘不忍睹,我的那個心啊,哇涼哇涼的啊 不過,忙碌的工作收穫也是巨大的 我們的團隊取得了驕人的成績!在此,我對團隊的每個成員表示衷心的感謝。我相信,中國的外包史上將銘刻這幾位同事的名字,他們是 成績歸成績,缺點也...