web-dev-qa-db-fra.com

Comment générer un journal JSON à partir de nginx?

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?

49
Jules Olléon

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

92
pva

Vous pouvez essayer d'utiliser celui-ci https://github.com/jiaz/nginx-http-json-log - module d'ajout pour Nginx.

7
ctrlok

Vous pouvez essayer d'utiliser:

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.

1
Valeriy Solovyov