nginx access_log日誌簡介

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

log_format 日誌格式html

一、語法:linux

log_format name(格式名字) 格式樣式(即想要獲得什麼樣的日誌內容)
示例:nginx

log_format main
'$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_s ent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'

二、具體參數格式web

nginx access_log日誌簡介nginx access_log日誌簡介

三、x_forwarded_for:算法

一般web服務器放在反向代理的後面,這樣就不能獲取到客戶的IP地址了,經過$remote_addr拿到的IP地址是反向代理服務器的iP地址。反向代理服務器在轉發請求的http頭信息中,能夠增長x_forwarded_for信息,用以記錄原有客戶端的IP地址和原來客戶端的請求的服務器地址。緩存

:在server中設置x_forwarded_forbash

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

access_log服務器

用了log_format 指令設置了日誌格式以後,須要用access_log指令指定日誌文件的存放路徑;工具

一、語法:fetch

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

access_log logs/access.log main;

二、設置刷盤策略:

access_log /data/logs/nginx-access.log buffer=32k flush=5s;

buffer 滿 32k 才刷盤;假如 buffer 不滿 5s 鍾強制刷盤。

:通常log_format在全局設置,能夠設置多個。access_log 能夠在全局設置,但每每是定義在虛擬主機(server)中的location中。
例如:

http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'"$status" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for" '
'"$gzip_ratio" $request_time $bytes_sent $request_length';
log_format srcache_log '$remote_addr - $remote_user [$time_local] "$request" '
'"$status" $body_bytes_sent $request_time $bytes_sent $request_length '
'[$upstream_response_time] [$srcache_fetch_status] [$srcache_store_status] [$srcache_expire]';
open_log_file_cache max=1000 inactive=60s;
server {
server_name ~^(www\.)?(.+)$;
access_log logs/$2-access.log main;
error_log logs/$2-error.log;
location /srcache {
access_log logs/access-srcache.log srcache_log;
}
}
}

三、其餘:

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];

參數註釋以下:

  • max:設置緩存中的最大文件描述符數量,若是緩存被佔滿,採用LRU算法將描述符關閉。
  • inactive:設置存活時間,默認是10s
  • min_uses:設置在inactive時間段內,日誌文件最少使用多少次後,該日誌文件描述符記入緩存中,默認是1次
  • valid:設置檢查頻率,默認60s
open_log_file_cache max=1000 inactive=20s valid=1m min_uses=2;

3)日誌分析:

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

查找訪問頻率最高的 URL 和次數:

cat access.log | awk -F ‘^A’ ‘{print $10}’ | sort | uniq -c

查找當前日誌文件 500 錯誤的訪問:

cat access.log | awk -F ‘^A’ ‘{if($5 == 500) print $0}’

查找當前日誌文件 500 錯誤的數量:
cat access.log | awk -F ‘^A’ ‘{if($5 == 500) print $0}’ | wc -l

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

cat access.log | awk -F ‘^A’ ‘{if($5 == 500) print $0}’ | grep ’09:00’ | wc-l

查找耗時超過 1s 的慢請求:

tail -f access.log | awk -F ‘^A’ ‘{if($6>1) print $0}’

假如只想查看某些位:

tail -f access.log | awk -F ‘^A’ ‘{if($6>1) print $3″|」$4}’

查找 502 錯誤最多的 URL:

cat access.log | awk -F ‘^A’ ‘{if($5==502) print $11}’ | sort | uniq -c

查找 200 空白頁

cat access.log | awk -F ‘^A’ ‘{if($5==200 && $8 < 100) print $3″|」$4″|」$11″|」$6}’

切割日誌

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*

一、分析:

  • 將上面的腳本放到crontab中,每小時執行一次(0 ),這樣每小時會把當前日誌重命名成一個新文件;而後發送USR1這個信號讓Nginx 從新生成一個新的日誌。(至關於備份日誌)
  • 將前7天的日誌刪除;

二、說明:

在沒有執行kill -USR1 $pid以前,即使已經對文件執行了mv命令而改變了文件名稱,nginx仍是會向新命名的文件」*access.log.2016032623」照常寫入日誌數據的。緣由在於:linux系統中,內核是根據文件描述符來找文件的。

三、logrotates:

使用系統自帶的logrotates,也能夠實現nginx的日誌分割,查看其bash源碼,發現也是發送USR1這個信號。

本文地址:https://www.linuxprobe.com/nginx-log-jianjie.html

相關文章
相關標籤/搜索