Назад | Перейти на главную страницу

Как избежать кавычек в формате журнала 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 совместимый

В новой версии 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"}