Come in qualsiasi sistema complesso, anche in PostgreSQL capitano situazioni in cui qualcosa va storto: le query ci mettono una vita, il carico sul server sale e gli utenti iniziano a innervosirsi. Il logging è il modo per tenere d’occhio cosa succede dentro il database, così da:
- Individuare le query lente — quelle che rallentano l’applicazione.
- Ottimizzare le performance — analizzando il comportamento delle query.
- Diagnosticare errori — tipo violazioni di constraint o sintassi sbagliata.
- Garantire l’audit — tracciare chi ha fatto cosa sul server.
Parametri chiave del logging
I file di configurazione di PostgreSQL (postgresql.conf) hanno un sacco di parametri legati al logging. Vediamo quelli più importanti.
log_statement— logging delle query SQL
Il parametro log_statement decide quali query SQL verranno scritte nel log. Può avere questi valori:
none— disattiva il logging delle query.ddl— logga solo i comandi di definizione dati (tipoCREATE,ALTER,DROP).mod— logga tutti i comandi che modificano i dati (tipoINSERT,UPDATE,DELETE).all— logga tutte le query SQL (anche i sempliciSELECT).
Esempio:
Per attivare il logging di tutte le query, nel file postgresql.conf imposta:
log_statement = 'all'
Se vuoi loggare solo i comandi che modificano i dati:
log_statement = 'mod'
Dopo aver cambiato la configurazione, ricordati di riavviare il server:
sudo systemctl restart postgresql
log_duration— logging del tempo di esecuzione
Il parametro log_duration permette di scrivere nel log il tempo di esecuzione di ogni query. Utile per capire quali query sono più pesanti in termini di tempo.
Esempio:
Per attivare il logging della durata delle query, imposta:
log_duration = on
Se vuoi loggare solo le query lente, usa il parametro log_min_duration_statement (lo vediamo tra poco).
log_min_duration_statement— logging delle query lente
Questo parametro permette di scrivere nel log solo le query che impiegano più del tempo specificato (in millisecondi). È super comodo per trovare i “colli di bottiglia” nel database.
Esempio:
Per loggare le query che durano più di 1 secondo:
log_min_duration_statement = 1000
Se vuoi loggare TUTTE le query a prescindere dalla durata, basta mettere 0:
log_min_duration_statement = 0
Il valore -1 disattiva il logging in base alla durata.
log_line_prefix— struttura del messaggio nel log
Il parametro log_line_prefix ti fa personalizzare il formato dei messaggi scritti. Utile per aggiungere contesto a ogni query loggata (tipo nome utente, PID, data e ora).
Esempio:
Per scrivere nome utente, database, ora e processo, usa:
log_line_prefix = '%t [%p]: [%d]: [%u]: '
Qui:
%t— ora della query.%p— PID del processo.%d— nome del database.%u— nome utente.
Lista di tutte le opzioni disponibili: Documentazione PostgreSQL.
logging_collector— raccolta dei log
Il parametro logging_collector attiva il meccanismo che scrive i log nei file. Se è disattivato, i log vanno solo in output standard (stdout), che può essere scomodo.
Per attivare il collector dei log:
logging_collector = on
Ricordati di specificare il percorso del file di log con log_directory e log_filename:
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'
Uso pratico dei parametri
Vediamo come usare i parametri di logging in uno scenario reale.
Scenario 1: logging di tutte le query
Se hai appena iniziato a lavorare con un nuovo database e vuoi vedere tutto quello che succede, imposta:
log_statement = 'all'
log_line_prefix = '%t [%p]: [%d]: [%u]: '
Ora ogni query eseguita nel database finirà nel file di log — comodissimo per il debug!
Scenario 2: trovare le query lente
Se hai notato che il server ogni tanto “rallenta” e vuoi trovare le query problematiche, imposta:
log_min_duration_statement = 500 # Logga le query più lunghe di 500 ms
log_line_prefix = '%t [%p]: [%d]: [%u]: [%r] '
Dove %r aggiunge l’indirizzo IP del client. Dopo averlo impostato, puoi facilmente trovare le query che sovraccaricano il server.
Scenario 3: modalità di logging minimale
Se il tuo server va liscio, ma vuoi solo un minimo di log per l’audit:
log_statement = 'mod'
log_duration = off
Qui vengono loggate solo le modifiche ai dati (tipo INSERT, UPDATE).
Analisi dei log
Quando i log iniziano a riempirsi di dati, è importante saperli analizzare! Puoi:
Aprire il file di log con un editor di testo:
cat /var/log/postgresql/postgresql.log
Usare strumenti per l’analisi, tipo grep, per trovare le query lente:
grep "duration: " /var/log/postgresql/postgresql.log
Usare tool per l’analisi avanzata dei log, come pgBadger.
Consigli utili
Un logging troppo dettagliato può aumentare il carico sul disco. Sulle macchine di produzione usa solo i parametri che ti servono davvero.
Pulisci o archivia regolarmente i vecchi file di log, così non riempi il disco.
Il logging è efficace se raccoglie solo i dati necessari. Ad esempio, log_min_duration_statement ti aiuta a restare preciso e risparmiare risorse.
Allora? Ora per noi non è più un problema impostare il logging in PostgreSQL e usarlo al meglio per analizzare le query e migliorare le performance. Come ha detto uno (anzi, più di uno) sviluppatore sconosciuto ma sicuramente in gamba: "I log sono la nostra occasione per guardare al passato delle query e sistemare il futuro del database".
GO TO FULL VERSION