Nginx Log 正規表達式

最近想分析 Nginx 的 Log,最後自己寫了一個 regex,記錄一下。在 IP 部分省麻煩沒有做任何驗證,IPv4 或 IPv6 皆可。

1
(?P<ip>[^\s]+)\s-\s(?P<remote_user>[^\s])\s\[(?P<time_local>[^]]*)\]\s\"(?P<request>(?P<method>[A-Z]{3,7})\s(?<uri>.*)\s(?<http_version>HTTP\/[^"]+))\"\s(?P<status>\d{3})\s(?P<body_bytes_sent>\d+)\s\"(?P<referer>[^\"]*)\"\s\"(?P<http_user_agent>[^\"]+)\"\s\"(?P<http_x_forwarded_for>[^\"]+)\"

這個正規表達式對應的是預設的 Nginx main log 格式:

1
2
3
log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';

Regex 中包含了對應的 Named capturing-group:

  • ip: 用戶 IP
  • remote_user: 使用者名稱
  • request: 使用者的 request
    • method: HTTP 方法
    • uri: HTTP request URI
    • http_version HTTP 版本
  • status: HTTP 狀態碼
  • body_bytes_sent: 酬載大小
  • referer: HTTP Referer
  • http_user_agent: User-agent
  • http_x_forwarded_for: Proxy 後的使用者 IP