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 blocserver: este permis doar în bloculhttp. - Redefinirea formatului
combined: numelecombinedeste rezervat și predefinit în Nginx; alege un nume nou (de exemplumain,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.