Consigner la requête analysée avec nginx

Comment définir un format de journal personnalisé pour nginx, afin que la requête soit analysée et que ses parties soient journalisées séparément?

Nous servons un fichier image pour compter le courrier ouvert. L’URL de l’image varie, mais suit la règle:

http://img.zgserver.com/logging/dailymail.gif 

XXXXX – identifiant de la campagne par email; AAAA – Identifiant du destinataire.

Il y a un journal séparé pour /counter emplacement, que je voudrais donner un format comme

 XXXXX YYYYY DATETIME 

La section de localisation ressemble à

  location ~* ^counter/([0-9]+)/([^/]+)/dailymail\.gif$ { access_log /var/log/mailopened.log alias /var/www/site.com/1x1.gif?cid=$1&uid=$2&type=daily; } 

J’ai donc les valeurs dans les variables $ 1 et $ 2. Comment puis-je les utiliser dans le format de journal?

log_format directive log_format est autorisée uniquement au niveau http , vous devez donc la définir en fonction d’autres variables, par exemple

 http { log_format tracking "$xxxx $yyyy $time_local"; 

Plus tard, dans votre région, définissez simplement ces variables et connectez-vous au format de tracking :

 location ~* ^counter/([0-9]+)/([^/]+)/dailymail\.gif$ { set $xxxx $1; set $yyyy $2; access_log /var/log/mailopened.log tracking; alias /var/www/site.com/1x1.gif?cid=$1&uid=$2&type=daily; } 

Avec les versions récentes de la librairie Nginx et PCRE, il est possible d’omettre les appels set et de nommer explicitement les captures dans l’ location (grâce à @kolbyjack):

 location ~* ^counter/(?[0-9]+)/(?[^/]+)/dailymail\.gif$ { access_log /var/log/mailopened.log tracking; alias /var/www/site.com/1x1.gif?cid=$1&uid=$2&type=daily; }