Я снимаю 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>])
Экранирует входную строку и создает выходную строку ASCII, готовую к использованию в качестве строки JSON. Конвертер пытается декодировать входную строку в соответствии с<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"}