nginx的access_log日志怎么設置

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

nginx的access_log日志怎么設置

log_format 日志格式

1、語法:

log_format name(格式名字) 格式樣式(即想要得到什么樣的日志內容) 示例:

log_format?main'$remote_addr?-?$remote_user?[$time_local]?"$request"?''$status?$body_bytes_s?ent?"$http_referer"?''"$http_user_agent"?"$http_x_forwarded_for"'
2、具體參數格式
nginx的access_log日志怎么設置
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?{ 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; } } }
3、其他:

1)error_log:

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

2)open_log_file_cache:

對于每一條日志記錄,都將是先打開文件,再寫入日志,然后關閉。你可以使用open_log_file_cache來開啟日志文件緩存(默認情況下是關閉的)。 語法:

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(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?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`;?domv?$i?$i.$DATEdonefor?i?in?`ls?$logdir/*error.log`;?domv?$i?$i.$DATEdonekill?-s?USR1?$pidrm?-v?$logdir"/access.log."$DATE_OLD*rm?-v?$logdir"/error.log."$DATE_OLD*
1、分析:
  • 將上面的腳本放到crontab中,每小時執行一次(0 ),這樣每小時會把當前日志重命名成一個新文件;然后發送USR1這個信號讓Nginx 重新生成一個新的日志。(相當于備份日志)

  • 將前7天的日志刪除;

2、說明:

在沒有執行kill -USR1 $pid之前,即便已經對文件執行了mv命令而改變了文件名稱,nginx還是會向新命名的文件”*access.log.2016032623”照常寫入日志數據的。原因在于:linux系統中,內核是根據文件描述符來找文件的。

3、logrotates:

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

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享