我正在捕捉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
兼容
答案1
新版本的 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"}