2012-11-06 9 views
6

Próbuję zmodyfikować mój format dziennika dostępu nginx, aby uwzględnić czas trwania żądania w sekundach.Zapisywanie całkowitego czasu żądania w sekundach do dziennika dostępu nginx, prawdopodobnie przy użyciu zmiennej obliczeniowej

widzę dwóch możliwych zmiennych może używać:

1) $request_time

2) $upstream_response_time

Jednak oba te zmienne wyrażone są w mikrosekundach i trzeba tę wartość do wydanego w sekundy. Czy istnieje sposób, aby określić dane wyjściowe jako wyrażenie (tj. $request_time * 1000) lub wykonać to w jakiś inny sposób?

Dzięki

+6

W rzeczywistości oba są już w sekundach (z rozdzielczością milisekundową, tzn. '$ Request_time' będzie wyglądać jak" 1.234 "). Zwróć uwagę, że format '$ upstream_response_time' jest bardziej złożony, ponieważ może zawierać taktowanie dla wielu serwerów podrzędnych (http://nginx.org/en/docs/http/ngx_http_upstream_module.html#variables). –

Odpowiedz

10

Serwer internetowy nie jest programem kalkulacyjnym ani statystycznym. Funkcja rejestrowania to podanie nieprzetworzonych danych, z którymi można przeprowadzić analizę. Jeśli program analityczny nie jest w stanie przekształcić mikrosekund na sekundy, powinieneś rozejrzeć się za innym oprogramowaniem. W każdym razie nierealistycznym jest oczekiwać, że funkcja rejestrowania programu wykona dla Ciebie konwersję jednostek. Celem rejestrowania nie jest formatowanie, ale rejestrowanie tego, co zostało zrobione, bez wpływu na wydajność jego podstawowej funkcjonalności.

0

Jeśli używasz reportera takiego jak LogStash (stos ELK), możesz wykonać pewne obliczenia podczas analizowania dziennika. Oto mój przykład do konwersji sekund do milisekundy w moim filtrze Logstash dla Nginx:

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

Nadzieja to pomaga.

Powiązane problemy