log_format în Nginx

Jurnale și depanare Toate versiunile Nginx

Definește structura unei linii din access_log (timpi de răspuns din backend, stare cache, format JSON pentru ELK/Loki).

Sintaxă
log_format nume [escape=default|json|none] șir ...;

Ce face log_format

Directiva log_format definește cum arată fiecare linie scrisă de access_log. Nginx are predefinit formatul standard combined (identic cu cel din Apache), dar acest format nu include două informații esențiale când folosești Nginx ca reverse proxy sau cu PHP-FPM: cât a durat cererea în total ($request_time) și cât a durat răspunsul backend-ului ($upstream_response_time).

Definind un format propriu în blocul http, poți adăuga aceste durate, starea cache-ului ($upstream_cache_status), gazda virtuală ($host) sau IP-ul din X-Forwarded-For. Mai mult, cu parametrul escape=json (disponibil din Nginx 1.11.8), poți scrie jurnalele direct ca obiecte JSON pe câte o linie, gata de indexat în Loki, Elasticsearch sau Datadog.

Formatul definit cu log_format nu are efect până când nu îi menționezi numele ca al doilea argument în directiva access_log.

Opțiuni și argumente

Opțiune / Parametru Descriere
Context: http log_format poate fi definit doar în contextul http.
escape=json Escapează automat caracterele speciale (", \) din variabile conform standardului JSON.
$request_time Durata totală a cererii în secunde, cu precizie de milisecunde (de la primul octet citit de la client până la ultimul octet trimis).
$upstream_response_time Timpul în secunde în care a răspuns backend-ul (PHP-FPM sau proxy_pass).
$upstream_cache_status Starea cache-ului Nginx (HIT, MISS, BYPASS etc.).
$remote_addr / $http_x_forwarded_for IP-ul conexiunii directe și antetul X-Forwarded-For.
$status / $body_bytes_sent Codul HTTP returnat și numărul de octeți din corpul răspunsului.

Exemple

Exemplul 1: Format text extins cu timpii de răspuns și starea cache-ului

Foarte util pentru a vedea dintr-o privire dacă o încetinire vine din PHP/backend (urt=) sau din rețeaua clientului (rt=):

# În contextul http:
log_format timed '$remote_addr - $remote_user [$time_local] '
                 '"$request" $status $body_bytes_sent '
                 '"$http_referer" "$http_user_agent" '
                 'rt=$request_time urt="$upstream_response_time" '
                 'cache=$upstream_cache_status';

# În server:
access_log /var/log/nginx/example.com.access.log timed;

Exemplu de linie în access.log

203.0.113.42 - - [23/Oct/2026:09:14:22 +0300] "GET /produse HTTP/2.0" 200 14820 "https://example.com/" "Mozilla/5.0" rt=0.042 urt="0.041" cache=MISS

Exemplul 2: Jurnal în format JSON pentru Loki / Elasticsearch / jq

Cu escape=json, ghilimelele din User-Agent sau URL nu strică structura JSON:

log_format json_analytics escape=json
    '{'
        '"time":"$time_iso8601",'
        '"remote_addr":"$remote_addr",'
        '"host":"$host",'
        '"method":"$request_method",'
        '"uri":"$request_uri",'
        '"status":$status,'
        '"bytes":$body_bytes_sent,'
        '"request_time":$request_time,'
        '"upstream_time":"$upstream_response_time",'
        '"cache":"$upstream_cache_status",'
        '"user_agent":"$http_user_agent"'
    '}';

access_log /var/log/nginx/access.json.log json_analytics;

Exemplul 3: Găsirea celor mai lente cereri din jurnalul JSON cu jq

Filtrează cererile care au durat mai mult de o secundă:

jq 'select(.request_time > 1.0) | {time, uri, status, request_time, upstream_time}' /var/log/nginx/access.json.log

Ieșire în terminal

{
  "time": "2026-10-23T09:18:04+03:00",
  "uri": "/api/raport-lunar",
  "status": 200,
  "request_time": 2.418,
  "upstream_time": "2.416"
}

Greșeli frecvente

  • Declararea log_format în interiorul unui bloc server: este permis doar în blocul http.
  • Redefinirea formatului combined: numele combined este rezervat și predefinit în Nginx; alege un nume nou (de exemplu main, timed, json_analytics).

Comenzi înrudite

  • access_log / error_log: Configurează jurnalele de acces și de erori (fișiere separate pe site, niveluri de severitate, dezactivare pe rute).
  • proxy_pass: Trimite cererea către un server backend (Node.js, Python, Go, Docker) și returnează răspunsul clientului.
  • fastcgi_cache: Salvează în cache răspunsurile HTML generate de PHP-FPM, servind paginile direct din Nginx fără a mai apela PHP și baza de date.
  • nginx.conf și sites-available: Cum sunt organizate fișierele de configurare: nginx.conf, include, conf.d, sites-available și sites-enabled.