2012-11-06 4 views
6

Ich versuche, mein Nginx-Zugriffsprotokollformat zu ändern, um die Anforderungsdauer in Sekunden einzuschließen.Schreiben der Gesamtanforderungszeit in Sekunden zu einem Nginx-Zugriffsprotokoll, möglicherweise unter Verwendung einer berechneten Variablen

Ich sehe zwei mögliche Variablen, die ich verwenden könnte:

1) $request_time

2) $upstream_response_time

jedoch beide dieser Variablen werden in Mikrosekunden ausgedrückt, und ich brauche diesen Wert in gerendert werden Sekunden. Gibt es eine Möglichkeit, die Ausgabe als Ausdruck anzugeben (d. H. $request_time * 1000) oder auf eine andere Weise zu erreichen?

Danke

+6

Eigentlich sind beide schon in Sekunden (mit Millisekunden Auflösung, d. H. "$ Request_time" sieht wie "1.234" aus). Beachten Sie, dass das $ upstream_response_time-Format komplexer ist, da es möglicherweise das Timing für [mehrere Upstream-Server] enthält (http://nginx.org/en/docs/http/ngx_http_upstream_module.html#variables). –

Antwort

10

Der Webserver ist kein Taschenrechner oder statistisches Programm. Die Protokollfunktion dient dazu, die Rohdaten bereitzustellen, mit denen Sie Ihre Analyse durchführen können. Wenn Ihr Analyseprogramm nicht in der Lage ist, Mikrosekunden in Sekunden zu konvertieren, sollten Sie nach anderer Software suchen. In jedem Fall ist es unrealistisch zu erwarten, dass die Protokollierungsfunktion eines Programms Einheitenumrechnungen für Sie ausführt. Das Ziel der Protokollierung ist nicht das Formatieren, sondern das Aufzeichnen dessen, was es getan hat, ohne die Leistung seiner Kernfunktionalität zu beeinträchtigen.

0

Wenn Sie einen Reporter wie LogStash (ELK-Stack) verwenden, können Sie einige Berechnungen durchführen, wenn Sie das Protokoll analysieren. Hier ist mein Beispiel Sekunde in Millisekunden in meinem Logstash Filter für Nginx zu konvertieren:

grok { 
     match => { 
     "message" => "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:timestamp}\] \"%{WORD:verb} %{URIPATHPARAM:logMessage} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response} (?:%{NUMBER:bytes}|-) (?:\"(?:%{URI:referrer}|-)\"|%{QS:referrer}) %{QS:agent} rt=%{NUMBER:duration_sec} cid=%{GREEDYDATA:correlationId}" 
     } 
} 
mutate { convert => [ "duration_sec", "float" ] } 
ruby { code => "event['duration_ms'] = event['duration_sec'].to_f * 1000" } 

Hoffnung, das hilft.

Verwandte Themen