Haproxy

如何僅以 haproxy 日誌格式轉義引號

  • September 18, 2019

我正在捕捉user-agent使用:

http-request capture req.hdr(User-Agent) len 192

然後嘗試創建這樣的自定義JSON日誌格式:

log-format '{"User-Agent":%{+Q,+E}[capture.req.hdr(0)]}'

它可以工作,但是當使用者代理包含方括號時,例如:

Dalvik/1.6.0 (Linux; U; Android 4.4.4; Ixion X LTE 4.5 [Build KTU84P])

該選項+E轉義方括號並阻止 JSON,它創建如下內容:

"User-Agent": "Dalvik/1.6.0 (Linux; U; Android 4.4.4; Ixion X LTE 4.5 \[Build KTU84P])"

當 UA 包含額外的引號時沒有問題:

"User-Agent": "this \"works\" fine"

因此想知道是否有一種方法可以指定僅轉義雙引號或替代方法以使日誌格式JSON兼容

較新版本的 haproxy 具有內置的 json 編碼器,您可以使用它來定義 JSON 日誌格式。見https://www.haproxy.org/download/2.1/doc/configuration.txt

json([<input-code>])

轉義輸入字元串並生成準備用作 JSON 字元串的 ASCII 輸出字元串。轉換器嘗試根據 <input-code>參數對輸入字元串進行解碼。它可以是“ ascii”、“ utf8”、“ utf8s”、“ utf8p”或“utf8ps”。“ascii”解碼器永遠不會失敗。

….

範例:

capture request header Host len 15
capture request header user-agent len 150
log-format '{"ip":"%[src]","user-agent":"%[capture.req.hdr(1),json(utf8s)]"}'

來自客戶端 127.0.0.1 的輸入請求:

GET / HTTP/1.0

User-Agent: Very "Ugly" UA 1/2

輸出日誌:

{"ip":"127.0.0.1","user-agent":"Very \"Ugly\" UA 1\/2"}

引用自:https://serverfault.com/questions/984593