J'essaie de générer un journal JSON à partir de nginx.
Je connais des solutions comme celle-ci mais certains des champs que je veux enregistrer incluent des entrées générées par l'utilisateur (comme les en-têtes HTTP) qui doivent être échappées correctement.
Je connais les entrées du journal des modifications nginx d'octobre 2011 et mai 2008 qui disent:
*) Change: now the 0x7F-0x1F characters are escaped as \xXX in an
access_log.
*) Change: now the 0x00-0x1F, '"' and '\' characters are escaped as \xXX
in an access_log.
mais cela n'aide toujours pas depuis \xXX
est non valide dans une chaîne JSON .
J'ai aussi regardé le HttpSetMiscModule module qui a un set_quote_json_str
directive, mais cela semble simplement ajouter \x22
autour des cordes ce qui n'aide pas.
Une idée d'autres solutions pour vous connecter au format JSON à partir de nginx?
Enfin, il semble que nous ayons un bon moyen de le faire avec Vanilla nginx sans aucun module. Définissez simplement:
log_format json_combined escape=json
'{'
'"time_local":"$time_local",'
'"remote_addr":"$remote_addr",'
'"remote_user":"$remote_user",'
'"request":"$request",'
'"status": "$status",'
'"body_bytes_sent":"$body_bytes_sent",'
'"request_time":"$request_time",'
'"http_referrer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
Notez que escape = json a été ajouté dans nginx 1.11.8. http://nginx.org/en/docs/http/ngx_http_log_module.html#log_format
Vous pouvez essayer d'utiliser celui-ci https://github.com/jiaz/nginx-http-json-log - module d'ajout pour Nginx.
Vous pouvez essayer d'utiliser:
module d'ajout pour Nginx nginx-http-json-log
Utilisez n'importe quelle langue comme dans nginx-json-logformat avec l'exemple /etc/nginx/conf.d/ json_log.conf
Une version du module d'état de stub Nginx HTTP qui sort au format JSON
PS: Le paramètre if (1.7.0) active la journalisation conditionnelle . Une demande ne sera pas enregistrée si la condition est évaluée à "0" ou à une chaîne vide:
map $status $http_referer{
~\xXX 0;
default 1;
}
access_log /path/to/access.log combined if=$http_referer;
C'est une bonne idée d'utiliser un outil tel que https://github.com/zaach/jsonlint pour vérifier vos données JSON. Vous pouvez tester la sortie de votre nouveau format de journalisation et vous assurer qu’il s’agit bien de JSON réel.