nginx的日誌格式標準
相信網際網路的從業人員,或多或少都會接觸access_log進行一些資訊的提取和分析,那麼如何高效的達成目標,今天我就將業務線的實踐分享給大家。
雖然我很羨慕那些能夠把access_log分析命令寫得足夠長的人,但我並不建議在線上依然保持如此原始的方式,通過使用格式化的日誌格式,我們會獲取以下收益:
- 日誌需求分析標準化
- 日誌需求分析工具化|外掛化
- 日誌欄位含義清晰
- 離線分析系統統計方法標準化
基於日誌格式的規範,不論是單機分析,還是離線叢集分析,效率都得到了大幅的提升,我們只需要做資料接入,通過各個產品線提供的外掛即可滿足絕大部分需求
log_format access
‘[Remote_ip:$remote_addr] ‘
‘[Remote_user:$remote_user] ‘
‘[Querytime:$time_local] ‘
‘[Request_url:$request] ‘
‘[Request_status:$status] ‘
‘[Request_byte_B:$bytes_sent] ‘
‘[Request_time_s:$request_time] ‘
‘[Http_referer:$http_referer] ‘
‘[Http_agent:$http_user_agent] ‘;
注意事項
- 要明確定義單位,從而讓分析系統能夠自適應
- 含義要清晰和標準,便於各類角色都能夠統一理解
- 分隔符要避免使用url中可能出現的字元
日誌示例
調整前:
10.10.10.10 – – [18/Mar/2016:09:47:16 +0800] “GET /test.php HTTP/1.1” 844 200
調整後:
[Remote_ip:10.10.10.10] [Remote_user:-] [Querytime:18/Mar/2016:09:47:16 +0800][Request_url:GET /test.php HTTP/1.1] [Request_status:200] [Request_byte_B:844]
問題:在日誌中找出訪問次數最多的幾個分鐘
- 原始格式:awk ‘{print $4}’ access_log |cut -c 14-18|sort|uniq -c|sort -nr|head
- 優化格式:cut -d “]” -f3 access_log|cut -d “:” -f2-4|sort |uniq -c |sort -nr|head
結論:優化格式,可以用最簡單的命令,100%保證日誌分析結果的可靠性和通用性,且越複雜的場景,其帶來的收益越顯著。