CodeGym /Corsi /SQL SELF /Log delle query

Log delle query

SQL SELF
Livello 45 , Lezione 3
Disponibile

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:

  1. Individuare le query lente — quelle che rallentano l’applicazione.
  2. Ottimizzare le performance — analizzando il comportamento delle query.
  3. Diagnosticare errori — tipo violazioni di constraint o sintassi sbagliata.
  4. 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.

  1. 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 (tipo CREATE, ALTER, DROP).
  • mod — logga tutti i comandi che modificano i dati (tipo INSERT, UPDATE, DELETE).
  • all — logga tutte le query SQL (anche i semplici SELECT).

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
  1. 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).

  1. 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.

  1. 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.

  1. 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".

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION