access_log / error_log în Nginx

Jurnale și depanare Toate versiunile Nginx

Configurează jurnalele de acces și de erori (fișiere separate pe site, niveluri de severitate, dezactivare pe rute).

Sintaxă
access_log cale [format [buffer=dim] [flush=timp] [if=condiție]] | off;
error_log  cale [debug | info | notice | warn | error | crit | alert | emerg];

Ce face access_log / error_log

Nginx scrie în două tipuri de jurnale: access_log înregistrează fiecare cerere HTTP procesată (IP-ul clientului, data, metoda, URI-ul, codul de stare, numărul de octeți, Referer și User-Agent), iar error_log înregistrează problemele întâlnite la pornire sau în timpul procesării cererilor (fișiere lipsă, conexiuni eșuate către PHP-FPM sau backend, erori SSL, limite depășite).

Pe Debian/Ubuntu jurnalele globale sunt în /var/log/nginx/access.log și /var/log/nginx/error.log (rotite automat de logrotate), dar în producție este mult mai ușor de depanat dacă fiecare bloc server își are propriile fișiere de jurnal.

Pentru rutele apelate foarte des și fără valoare de audit (verificări /healthz, imagini, favicon), access_log off; în acel bloc location oprește scrierea în jurnalul de acces și reduce operațiile pe disc.

Opțiuni și argumente

Opțiune / Parametru Descriere
Context: http, server, location error_log poate apărea și la nivelul rădăcină (main) din nginx.conf.
access_log off Dezactivează complet înregistrarea în jurnalul de acces pentru contextul curent.
buffer=64k flush=5s Adună liniile de jurnal în memorie și le scrie pe disc în calupuri (util pe site-uri cu trafic foarte mare).
if=$variabilă Jurnalizare condiționată: înregistrează cererea doar dacă variabila nu este goală și nu este "0".
Niveluri error_log De la cel mai detaliat la cel mai grav: debug, info, notice, warn, error (implicit), crit, alert, emerg.
syslog:server=... Trimite jurnalele către un server syslog sau către stderr/stdout (în Docker).

Exemple

Exemplul 1: Jurnale dedicate pentru un site și excluderea rutelor de zgomot

Cererile pentru /healthz și /favicon.ico nu poluează access.log:

server {
    listen 80;
    server_name example.com;
    root /var/www/example.com/public;

    access_log /var/log/nginx/example.com.access.log combined buffer=32k flush=5s;
    error_log  /var/log/nginx/example.com.error.log warn;

    location = /healthz {
        access_log off;
        return 200 "ok\n";
    }

    location = /favicon.ico {
        access_log off;
        log_not_found off;
    }
}

Exemplul 2: Înregistrarea în access_log doar a cererilor cu eroare (4xx și 5xx)

Folosind map pe variabila $status și parametrul if= din access_log:

# În contextul http:
map $status $loggable_error {
    ~^[23]  0;
    default 1;
}

# În contextul server:
access_log /var/log/nginx/errors-only.access.log combined if=$loggable_error;

Exemplul 3: Urmărirea în timp real a jurnalelor și găsirea celor mai frecvente erori

Comenzi uzuale la depanare:

sudo tail -f /var/log/nginx/example.com.error.log
awk '{print $9}' /var/log/nginx/example.com.access.log | sort | uniq -c | sort -rn | head -5

Ieșire în terminal

  18420 200
   1204 304
    312 301
     48 404
      3 502

Greșeli frecvente

  • A încerca să dezactivezi jurnalul de erori cu error_log off;: spre deosebire de access_log, pentru error_log cuvântul off nu este cuvânt-cheie, ci creează un fișier numit literal off în directorul Nginx! Dacă vrei să-l dezactivezi, scrie error_log /dev/null crit;.
  • Lăsarea nivelului debug activat pe un server de producție: generează cantități uriașe de text pentru fiecare cerere și poate umple discul în câteva minute.

Comenzi înrudite

  • log_format: Definește structura unei linii din access_log (timpi de răspuns din backend, stare cache, format JSON pentru ELK/Loki).
  • nginx -s reload: Trimite un semnal procesului master Nginx: reload, stop, quit sau reopen.
  • server: Definește un server virtual (un site) cu porturile, numele de domeniu și regulile sale.
  • nginx.conf și sites-available: Cum sunt organizate fișierele de configurare: nginx.conf, include, conf.d, sites-available și sites-enabled.