如何仅转义 haproxy 日志格式中的引号

如何仅转义 haproxy 日志格式中的引号

我正在捕捉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"}

相关内容