fluentd 解析httpd日誌

 須要解析httpd的日誌css

107.106.8.237.145 - - [12/Feb/2020:15:09:52 +0800] "GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1" 404 240 "http://39.96.45.213/noindex/css/open-sans.css" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"nginx

fluentd配置web

<source>
  @id httpd
  @type tail
  path /data/logs/kim-todo-api-prod/log/statistics.log
  pos_file /home/web_server/ingress-nginx/statistics.log.pos
  tag *
  read_from_head true
  format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
</source>

解析後的效果
fluentd 解析httpd日誌api

一、其中format 後面是正則匹配語句,
二、()表示捕獲分組,()會把每一個分組裏的匹配的值保存起來,不難看出尖括號<>裏面是一個key,圓括號()裏的正則匹配出想要的value
三、(?:)表示非捕獲分組,和捕獲分組惟一的區別在於,非捕獲分組匹配的值不會保存起來,這裏你們會有疑問 (?:) 裏的字符照樣被匹配出來裏啊,這裏有幾個特殊用法
非捕獲數組不參與編號分配但參與匹配
A:形如 (?: (exp))
也就是說exp中按照正常的分組邏輯進行分組
B:形如(?: ()|())
嚴格說這樣寫是解決選擇緩存問題的寫法(直接用圓括號會有一個反作用,是相關的匹配會被緩存,此時可用?:放在第一個選項前來消除這種反作用。)
C:形如 ((?: exp))
這種寫法我認爲等價於(exp)
四、圓括號外的中括號 []是去除一些無用字符
五、右斜槓 \ 是轉義字符
六、\S 表示非空白就匹配 +表示 匹配前面的子表達式一次或屢次
七、[^ ]* 表示匹配掉全部的空字符
八、?表示非貪婪匹配,即匹配到一個符合的就ok,再也不繼續匹配
九、表達式首尾有 " 表示匹配的是 "" 裏的內容
十、+ 表示匹配前面的子表達式一次或屢次數組

相關文章
相關標籤/搜索