3 votes

Comment échapper uniquement les guillemets dans le format de journalisation haproxy

Je capture le user-agent en utilisant :

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

Et ensuite j'essaie de créer un format de journal personnalisé JSON comme ceci :

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

Cela fonctionne mais lorsque le User Agent inclut des crochets, par exemple :

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

L'option +E échappe aux crochets et casse le JSON, cela crée quelque chose comme :

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

Lorsque l'UA contient des guillemets supplémentaires, il n'y a pas de problème :

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

Je me demande donc s'il existe un moyen de spécifier l'échappement uniquement pour les guillemets doubles ou des alternatives pour rendre le format de journal compatible avec le JSON

2voto

snowdude Points 2790

Les nouvelles versions de haproxy ont un encodeur JSON intégré, que vous pouvez utiliser pour définir un format de journal JSON. Voir https://www.haproxy.org/download/2.1/doc/configuration.txt

json([])
Échappe la chaîne d'entrée et produit une chaîne de sortie ASCII prête à être utilisée comme une chaîne JSON. Le convertisseur tente de décoder la chaîne d'entrée selon le paramètre de . Il peut être "ascii", "utf8", "utf8s", "utf8p" ou "utf8ps". Le décodeur "ascii" ne échoue jamais.
....
Exemple:

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)]"}'

Requête entrante du client 127.0.0.1:

GET / HTTP/1.0

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

Journal de sortie:

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

0 votes

Juste au cas où fonctionne également dans les versions 2.0.X

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X