2012-04-06 10 views
2

Wie ein benutzerdefiniertes Protokollformat für Nginx, so dass Anfrage geparsed und seine Teile getrennt protokolliert werden?Log geparste Anfrage mit Nginx

Wir liefern eine Bilddatei, um die Post zu zählen. Die URL zu dem Bild ist unterschiedlich, aber folgt die Regel:

http://www.server.com/counter/XXXXX/YYYYY/dailymail.gif 

XXXXX - id E-Mail-Kampagne; YYYYY - Empfänger-ID.

Es gibt ein separates Protokoll für /counter Lage, die Ich mag würde ein Format wie

XXXXX YYYYY DATETIME 

Lage geben, sieht so aus

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; 
    } 

Also habe ich die Werte in Variablen $ 1 und $ 2 . Wie kann ich sie im Log-Format verwenden?

Antwort

5

log_format Direktive ist erlaubt auf http Ebene nur, so müssen Sie es in Bezug auf andere Variablen definieren, z.

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

Später, in Ihrer Position, setzen nur diese Variablen und melden tracking Format:

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; 
} 

Mit den jüngsten Versionen von Nginx und PCRE-Bibliothek ist es möglich, set Anrufe zu verzichten und die Captures nennen explizit in location (dank @kolbyjack):

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

Mit der jüngsten Version von nginx, können Sie die Aufnahmen einen Namen geben und die eingestellten Anrufe überspringen mit 'l ocation ~ * ^/counter/(? [0-9] +)/(? [^ /] +)/dailymail.gif $ {' – kolbyjack

+0

Guter Fang! PCRE-Version ist auch relevant - Sie können die neuesten Nginx und alte PCRE .. –

+0

Guter Punkt. Bei einem alten pcre müssten Sie '? P <' anstatt nur '? <' Verwenden – kolbyjack