首頁  >  文章  >  後端開發  >  純手工玩 Nginx 日誌

純手工玩 Nginx 日誌

WBOY
WBOY原創
2016-08-08 09:22:34792瀏覽
Nginx 日誌對大部分人來說是個未被發掘的寶藏,總結之前做某日誌分析系統的經驗,和大家分享一下 Nginx 日誌的純手工分析方式。 Nginx 日誌相關配置有 2 個地方:access_log 和 log_format 。 預設的格式:
access_log <span>/</span>data<span>/</span>logs<span>/</span>nginx<span>-</span>access<span>.</span><span>log</span><span>;</span>log_format old <span><em>'$remote_addr [$time_local] $status $request_time $body_bytes_sent '</em></span><span><em>'"$request" "$http_referer" "$http_user_agent"'</em></span><span>;</span>
相信大部分用過 Nginx 的人對預設 Nginx 日誌格式配置都很熟悉,對日誌的內容也很熟悉。但是預設配置和格式雖然可讀,但是難以計算。 Nginx 日誌刷盤相關策略可配置:比如,設定buffer,buffer 滿32k 才刷盤;假如buffer 不滿5s 鐘強制刷盤的配置如下:
access_log <span>/</span>data<span>/</span>logs<span>/</span>nginx<span>-</span>access<span>.</span><span>log</span> buffer<span>=</span><span><em>32k</em></span> flush<span>=</span><span><em>5s</em></span><span>;</span>
這決定瞭是否實時看到日誌以及日誌對磁碟IO 的影響。 Nginx 日誌能夠記錄的變數還有很多沒出現在預設設定中:例如:請求資料大小:$request_length
傳回資料大小:$bytes_sent
請求耗時:$request_time
傳回資料大小:$bytes_sent
請求耗時:$request_time傳回資料大小:$bytes_sent請求耗時:$request_time所用序號connection目前連線發生請求數:$connection_requestsNginx 的預設格式不可計算,需要想辦法轉換成可計算格式,例如用控製字元^A (Mac 下ctrl+v ctrl+a 打出)分割每個欄位。 log_format 的格式可以變成這樣:
  • log_format new <span><em>'$remote_addr^A$http_x_forwarded_for^A$host^A$time_local^A$status^A'</em></span><span><em>'$request_time^A$request_length^A$bytes_sent^A$http_referer^A$request^A$http_user_agent'</em></span><span>;</span>

    這樣之後就透過常見的 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

    查看即時日誌資料流

    tail -f access.log | cat -e

  • tail -f access.log | tr '^A' '|'🎜總結🎜🎜照著這個思路可以做很多其他分析,UA最多的訪問;訪問頻率最高的IP;請求耗時分析;請求返回包大小分析;等等。 🎜這就是一個大型 Web 日誌分析系統的原型,這樣的格式也是非常方便進行後續大規模 batching 和 streaming 計算。

    以上就介紹了純手工玩轉 Nginx 日誌,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

    陳述:
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn