Documentazione di PostgreSQL 9.0 > Amministrazione del server > Configurazione del server > Log e presentazione degli errori
PrecedenteQuery PlanningStatistiche durante l'esecuzioneSuccessivo

18.7. Log e presentazione degli errori

18.7.1. Dove fare il log

log_destination (string)

PostgreSQL™ supporta diversi metodi per fare il log dei messaggi sel server, incluso stderr, csvlog e syslog. Su windows, è supportato anche eventlog. Impostare questo parametro a un elenco di destinazioni di log desiderate seprate da virgole. Il metodo predefinito è di fare il log solamente su stderr. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

Se csvlog è incluso in log_destination, le voci di log sono0 mandate in output nel formato (CSV) «separato da virgole», che è utile per il caricamento dei log nei programmi. Si veda Sezione 18.7.4, «Usare l'output di log in formato CSV» per dettagli. logging_collector deve essere abilitato per generare output di log in formato CSV.

[Nota]

Nota

Sulla maggior parte dei sistemi Unix, si dovrà cambiare la configurazione del proprio demone syslog di sistema per poter usare l'opzione syslog per log_destination. PostgreSQL™ can log to syslog facilities LOCAL0 through LOCAL7 (see syslog_facility), but the default syslog configuration on most platforms will discard all such messages. Si dovrà aggiungere qualcosa come:

local0.*    /var/log/postgresql

nel file di configurazione del demone syslog per farlo funzionare.

logging_collector (boolean)

Questo parametro cattura i messaggi di log normali e in formato CSV mandati a stderr e li redirige in file di log. Questo approccio è spesso più utile rispetto a eseguire il log su syslog, dato che alcuni tipi di messaggi potrebbero non apparire nell'output di syslog (un esempio tipico sono i messaggi di fallimento del linker dinamico). Questo parametro può essere impostato solo all'avvio del server.

[Nota]

Nota

Il collettore di log è disegnato per non perdere mai messaggi. Questo signigfica che in caso di carico estremamente alto, i processi server potrebbero essere bloccati per provare a mandare messaggi di log aggiuntivi quando il collettore è rimasto indietro. Per contro, syslog preferisce eliminare i messaggi se non può scriverli, che significa che è meno attendibilein quei casi ma non bloccherà il resto del sistema.

log_directory (string)

Quando è abilitato logging_collector, questo parametro determina la directory in cui i file di log saranno creati. Può essere scpecificato come percorsco assoluto, o relativo alla directory dei dati del cluster. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

log_filename (string)

Quando logging_collector è abilitato, questo paramentro imposta i nomi dei file dei file di log creati. Il valore è trattato come un modello strftime, quindi gli escape con % possono essere usati per specificare nomi di file che variano col tempo. (Si noti che se ci sono escape con % che dipendono dal fuso orario, il calcolo viene eseguito nel fuso specificato da log_timezone). Si noti che il strftime del sistema non viene usato direttamente, quindi estensioni specifiche alla piattaforma (non standard) non funzioneranno.

Se si specifica un nome di file senza escape, si dovrebbe pianificare l'utilizzo di un'utilità di rotazione di log per evitare di riempire il disco. In versioni precedenti la 8.4, se non sono presenti escape %, PostgreSQL™ aggiungerà l'epoch del momento di creazione del nuovo file di log, ma questo non avviene più.

Se l'output in formato CSV è abilitati in log_destination, .csv sarà aggiunto al nome del file di log per creare il nome del file per output in formato CSV. (Se log_filename finisce in .log, il suffisso invece è sostituito). Nel caso dell'esempio sopra, il nome del file CSV sarà server_log.1093827753.csv.

Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

log_file_mode (integer)

Su sistemi Unix questo parametro imposta i permessi per i file di log quando è abilitato logging_collector. (Su Microsoft Windows questo parametro viene ignorato). Il valore del parametro ci si aspetta sia un modo numerico specificato nel formato accettato dalle chiamate di sistema chmod e umask. (Per usare il formato ottale consueto il numero deve iniziare con uno 0 (zero)).

I permessi predefiniti sono 0600, che significa che solo il proprietario del server può leggere o scrivere i file di log. L'altra impostazione utile è 0640, che permette ai membri del gruppo del proprietario di leggere i file. Notare comunque che per usare quest'impostazione, si dovrà modificare log_directory per immagazzinare i file da qualche parte fuori dalla directory dei dati del cluster. In ogni caso, non è saggio rendere i file di log leggibili da tutti, dato che potrebbero contenere dati sensibili.

Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

log_rotation_age (integer)

Quando è abilitato logging_collector, questo parametro determina il periodo di vita massimo di un file di log individuale. Dopo che questi minuti sono passati, un nuovo file di log sarà creato. Si imposti a zero per disabilitare la creazione basata sul tempo di nuovi file di log. Questo parametro può essere impostato nel file postgresql.conf o dalla linea di comando del server.

log_rotation_size (integer)

Quando è abilitato il logging_collector, questo parametro determina la dimensione massima di un file di log individuale. Dopo che questo numero di kilobyte è stato emesso nel file di log, verrà creato un nuovo file di log. Impostarlo a zero per disabilitare la creazione basata sulla dimensione di nuovi file di log. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

log_truncate_on_rotation (boolean)

Quando è abilitato logging_collector, questo causerà che PostgreSQL™ tronchi (sovrascriva), piuttosto che aggiungerli in coda, qualsiasi file di log esistente con lo stesso nome. Comunque, il troncamento avverrà solo quando un nuovo file sarà aperto per la rotazione basata ul tempo, non durante l'avvio del server o rotazioni basate sulla dimensione. Quando spento, i file pre esistenti saranno messi in coda in ogni caso. Per esempio, usare questa impostazione in combinazione con un log_filename simile a postgresql-%H.log risulterebbe nella generazione di ventiquattro file di log e quindi sovrascriverli ciclicamente. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

Esempio: per tenere 7 giorni di log, un file di log per giorno chiamato server_log.Mon, server_log.Tue, ecc., e sovrascrivere automaticamente il log dell'ultima swettimana con quello di questa settimana, impostare log_filename a server_log.%a, log_truncate_on_rotation a on e log_rotation_age a 1440.

Esempio: per tenere 24 ore di log, un file di log per ora, ma anche ruotare prima se la dimensione del file di log eccede 1GB, impostare log_filename a server_log.%H%M, log_truncate_on_rotation a on, log_rotation_age a 60 e log_rotation_size a 1000000. Includere %M in log_filename permette qualsiasi rotazione guidata dalla dimensione che potrebbe accadere per selezionare un nome di file diverso dal nome del file iniziale dell'ora.

syslog_facility (enum)

Quando è abilitato il log su syslog, questo parametro determina la «facility» di syslog da usare. Si può scegliere tra LOCAL0, LOCAL1, LOCAL2, LOCAL3, LOCAL4, LOCAL5, LOCAL6, LOCAL7; il valore predefinito è LOCAL0. Si veda inoltre la documentazione del demone syslog del proprio sistema. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

syslog_ident (string)

Quando è abilitato il log verso syslog, questo parametro determina il nome del programma usato per identificare i messaggi di PostgreSQL™ nei log di syslog. Il valore predefinto è postgres. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

silent_mode (boolean)

Avvia il server silenziosamente. Se questo parametro è impostato, il server andrà in esecuzione automaticamente in background è non associato al terminale di controllo. Questo parametro può essere impostato solo all'avvio del server.

[Attenzione]

Attenzione

Quando questo parametro è impostato, lo standard output e lo standard error del server sono mandati al file postmaster.log senza la directory dei dati. There is no provision for rotating this file, so it will grow indefinitely unless server log output is redirected elsewhere by other settings. Si raccomanda che log_destination sia impostato a syslog o che logging_collector sia abilitato quando si usa quest'opzione. Anche con queste misure, errori riportati precedentemente durante l'avvio potrebbero apparire in postmaster.log piuttosto che le normale destinazione di log.

18.7.2. Quando fare il log

client_min_messages (enum)

Controlla quali livelli di messaggio sono mandati al client. Valori validi sono DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, LOG, NOTICE, WARNING, ERROR, FATAL, e PANIC. Ogni livello include tutti i livelli che seguono. Maggiore è il livello, minore è il numero di messaggi mandati. Il valore predefinito è NOTICE. Notare che LOG ha un livello differente qui rispetto a log_min_messages.

log_min_messages (enum)

Controlla quali livelli di messaggio sono scritti al log del server. Valori validi sono DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, e PANIC. Ogni livello include tutti i livelli che lo seguono. Maggiore è il livello, meno messaggi sono mandati al log. Il valore predefinito è WARNING. Si noti che LOG ha un livello differente qui rispetto a client_min_messages. Solo i superutenti posso cambiare quest'impostazione.

log_min_error_statement (enum)

Controlla quali istruzioni SQL che causano una condizione di errore sono registrati nel log del server. L'istruzione SQL corrente è inclusa nella voce di log per qualsiasi messaggio della severità specificata o maggiore. Valori validi sono DEBUG5, DEBUG4, DEBUG3, DEBUG2, DEBUG1, INFO, NOTICE, WARNING, ERROR, LOG, FATAL, e PANIC. Il valore predefinito è ERROR, che significa che saranno sottoposte a log le istruzioni che causano errori, messaggi di log, errori fatali, o panic. Per disabilitare effettivamente il log delle istruzioni che falliscono, impostare questo parametro a PANIC. Solo i superutenti possono cambiare questa impostazione.

log_min_duration_statement (integer)

Fa sì che la durata di ogni istruzione completata sia sottoposta a log se l'istruzion è durata almeno il numero di specificato di millisecondi. Impostare questo a zero stampa tutte le durate delle istruzioni. Meno-uno (il valore predefinito) disabilita il log delle durate delle istruzioni. Per esempio, se lo si imposta a 250ms allora tutte le istruzioni SQL che girano per 250ms o più a lungo saranno sottoposte a log. Abilitare questo parametro può essere utile per tenere d'occhio query non ottimizzate nelle proprie applicazioni. Solo i superutenti possono cambiare questa impostazione.

Per client che usano il protocollo di query esteso, le durate dei passi Parse, Bind e Execute sono sottoposte a log indipendentemente.

[Nota]

Nota

Quando si usa questa opzione insieme a log_statement, il testo di istruzioni che sono sottoposte a log per via di log_statement non saranno ripetute nel messaggio di log relativo alla durata. Se non si sta usando syslog, si raccomanda di tenere i log del PID o dell'ID di sessione usando log_line_prefix così che si possa collegare il messaggio di istruzione al messaggio di durata usando l'ID del processo o l'ID della sessione.

Tabella 18.1, «Livelli di severità del messaggio» spiega i livelli di severità del messaggio usati da PostgreSQL™. Se l'output di log viene mandato a syslog o all'eventlog di Windows, i livelli di severità sono tradotti come mostrato nella tabella.

Tabella 18.1. Livelli di severità del messaggio

SeveritàUtilizzosyslogeventlog
DEBUG1..DEBUG5 Fornisce informazioni progressivamente maggiormente dettagliate per gli sviluppatori. DEBUGINFORMATION
INFO Fornisce informazioni richieste implicitamente dall'utente, per es., l'output proveniente da VACUUM VERBOSE.INFOINFORMATION
NOTICE Fornisce informazioni che potrebbero essere utili per gli utenti, per es., si noti il troncamento di identificatori lunghi.NOTICEINFORMATION
WARNING Fornisce warning per i probabili problemi, per es., COMMIT fuori da un blocco di transazion.NOTICEWARNING
ERROR Riporta un errore che ha causato l'annullamento del comando corrente. WARNINGERROR
LOG Riporta informazioni di interesse per amministratori, per es., l'attività di checkpoint. INFOINFORMATION
FATALRiporta un errore che ha causato l'annullamento della sessione corrente.ERRERROR
PANICRiporta un errore che ha causato l'annullamento delle sessioni di database.CRITERROR

18.7.3. Cosa sottoporre a log

application_name (string)

L'application_name può essere qualsiasi stringa di meno che NAMEDATALEN caratteri (64 caratteri in una compilazione standard). Tipicamente è impostato da un'applicazione al momento della connessione al server. Il nome sarà visualizzato nella vista pg_stat_activity e inclusa nelle voci di log CSV. Può anche essere incluso in voci di log regolari attraverso il parametro log_line_prefix. Solo i caratteri ASCII stampabili possono essere usati nel valore application_name. Altri caratteri saranno sostituiti con punti interrogativi (?).

debug_print_parse (boolean), debug_print_rewritten (boolean), debug_print_plan (boolean)

When set, they print the resulting parse tree, the query rewriter output, or the execution plan for each executed query. These messages are emitted at LOG message level, so by default they will appear in the server log but will not be sent to the client. È possibile cambiarlo aggiustando client_min_messages e/o log_min_messages. Questi parametri sono impostati a off in maniera predefinita.

debug_pretty_print (boolean)

Quando impostato, debug_pretty_print indenta i messaggi prodotti da debug_print_parse, debug_print_rewritten o debug_print_plan. Questo risulta in un output più leggibile ma molto più lungo rispetto al formato «compatto» usato quando sono spenti. Il valore predefinito è on.

log_checkpoints (boolean)

Fa sì che i checkpoint siano sottoposti a log nel log del server. Alcune statistiche su ogni checkpoint sono incluse nei messaggi di log, compreso il numero di buffer scritti e il tempo speso scrivendoli. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server. Il valore predefinito è off.

log_connections (boolean)

Fa sì che ogni tentativo di connessione al server siano messe nel log, così come il completamento con successo dell'autenticazione del client. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server. Il valore predefinito è off.

[Nota]

Nota

Alcuni programmi client, come psql, tentano di connettersi due volte mentre determinano se una password viene richiesta, quindi messaggi «connection received» duplicati non indicano necessariamente un problema.

log_disconnections (boolean)

Questo rende in output una linea nel log del server simile a log_connections ma al termine della sessione, e include la durata della sessione. Questo è off in maniera predefinita. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server. Il valore predefinito è off.

log_duration (boolean)

Fa sì che la durata di ogni istruzione completata sia messa nel log. Il valore predefinito è off. Solo i superutenti possono cambiare questo valore.

Per client che usano il protocollo di query esteso, la durata dei passi di Parse, Bind ed Execute sono sottoposti a log in modo indipendente.

[Nota]

Nota

La differenza tra impostare questa opzione e impostare log_min_duration_statement a zero è che eccedere log_min_duration_statement forza il testo della query da mettere nel log, ma questa opzione non lo fa. Così, se log_duration è on e log_min_duration_statement ha un valore positivo, tutte le durate sono messe nel log ma il testo della query è incluso solo per istruzioni che eccedono la soglia. Questo comportamento può essere utile per raccogliere statistiche in installazioni dal carico alto.

log_error_verbosity (enum)

Controlla l'ammontare di dettagli scritti nel log del server per ogni messaggio che viene sottoposto a log. Valori validi sono TERSE, DEFAULT, e VERBOSE, ognuna che aggiunge più campi per i messaggi mostrati. TERSE esclude il log di informazioni di errore di DETAIL, HINT, QUERY e CONTEXT. L'output VERBOSE include il codice di error SQLSTATE (si veda anche Appendice A, Codici di errore di PostgreSQL) e il nome del file sorgente, il nome della funzione, e il numero di linea che ha generato l'errore. Solo i superutenti possono cambiare questo valore.

log_hostname (boolean)

In modo predefinito, i messaggi di log di connessione mostrano l'indirizzo IP del host che si sta connettendo. Abilitare questo parametro fa si che anche il nome del host venga messo nel log. Note that depending on your host name resolution setup this might impose a non-negligible performance penalty. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

log_line_prefix (string)

Questà è una stringa in stile printf che è l'output all'inizio di ogni linea di log. I caratteri % sono l'inizio di «sequenze di escape» che sono sostituiti con informazioni di stato come descritto sotto. Gli escape non riconosciuti vengono ignorati. Gli altri caratteri sono copiati direttamente nella linea di log. Alcuni escape sono riconosciuti solo da processi di sessione, e sono ignorati da processi in background tipo il processo principale del server. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server. Il valore predefinito è una stringa vuota.

EscapeEffettoSolo sessione
%aNome dell'applicazionesi
%uNome utentesi
%dNome del databasesi
%rNome del host remoto o indirizzo IP, e porta remotasi
%hNome del host remoto o indirizzo IPsi
%pProcess IDno
%tTime stamp without millisecondsno
%mTime stamp with millisecondsno
%iTag del comando: tipo del comando corrente della sessionesi
%ecodice di error SQLSTATEno
%cID della sessione: si veda sottono
%lNumero della linea di log per ogni sessione o processo, cominciando da 1no
%sMomento d'avvio del processono
%vID della transazione virtuale (backendID/localXID)no
%xID della transazione (0 se non è asegnato)no
%q Non produce output, ma dice ai processi non di sessione di fermarsi a questo punto nella stringa; ignorato dai processi di sessione no
%%Literal %no

Il codice ecape %c stampa un identificatore di sessione quasi univoco, che consiste di due numeri esadecimali a 4 byte (senza zeri all'inizio) separati da un punto. I numeri sono il momento iniziale del processo e l'ID del processo, quindi %c può essere usato anche come modo per salvare spazio di stampa di quegli elementi. Per esempio, per generare l'identificatore di sessione da pg_stat_activity, usare questa query:

SELECT to_hex(EXTRACT(EPOCH FROM backend_start)::integer) || '.' ||
       to_hex(procpid)
FROM pg_stat_activity;

[Suggerimento]

Suggerimento

Se si imposta un valore non vuoto per log_line_prefix, si deve solitamente usare uno spazio come ultimo carattere, per fornire una separazione visuale dal resto della linea di log. Può essere usato anche un carattere di punteggiatura.

[Suggerimento]

Suggerimento

Syslog produce le proprie informazioni di orario e di ID di processo, quindi probabilmente non si vorrà includere questi escape se si sta facendo il log su syslog.

log_lock_waits (boolean)

Controlla se un messaggio di log viene prodotto quando una sessione aspetta più a lungo di deadlock_timeout per acquisire un lock. Questo è utile per determinare se l'attesa del lock stanno causando un decadimento di prestazioni. Il valore predefinito è off.

log_statement (enum)

Controls which SQL statements are logged. Valid values are Controlla quali istruzioni SQL sono messe nel log. Valori validi sono none (off), ddl, mod e all (tutte le istruzioni). ddl mette nel log tutte le istruzioni di data definition, tipo istruzioni CREATE, ALTER e DROP. mod mette nel log tutte le istruzioni ddl, più le istruzioni di modifica dei dati tipo INSERT, UPDATE, DELETE, TRUNCATE, e COPY FROM. Anche le istruzioni PREPARE, EXECUTE e EXPLAIN ANALYZE sono messe nel log se il loro comando contenuto è del tipo appropriato. Per client che usano il protocollo di query esteso, il log avviene quando un messaggio Execute è ricevuto, e i valori dei parametri Bind sono inclusi (con qualsiasi apice singolo incluso raddopiato).

Il valore predefinito è none. Solo i superutenti possono cambiare questa impostazione.

[Nota]

Nota

Statements that contain simple syntax errors are not logged even by the log_statement = all setting, because the log message is emitted only after basic parsing has been done to determine the statement type. In the case of extended query protocol, this setting likewise does not log statements that fail before the Execute phase (i.e., during parse analysis or planning). Set log_min_error_statement to ERROR (or lower) to log such statements.

log_temp_files (integer)

Controls logging of temporary file names and sizes. Temporary files can be created for sorts, hashes, and temporary query results. A log entry is made for each temporary file when it is deleted. A value of zero logs all temporary file information, while positive values log only files whose size is greater than or equal to the specified number of kilobytes. Il valore predefinito è -1, che disabilita questo log. Solo i superutenti possono cambiare questo valore.

log_timezone (string)

Imposta il fuso orario usato per istanti di tempo scritti nel log. A differenza di timezone, questo valore è a livello di cluster, così che tutte sessioni riporteranno gli orari in maniera consistente. Il valore predefinito è unknown, che significa usare qualsiasi cosa venga specificata dal sistema operativo come fuso orario. Si veda Sezione 8.5.3, «Fusi OrarioTime Zones» per maggiori informazioni. Questo parametro può essere impostato solo nel file postgresql.conf o dalla linea di comando del server.

18.7.4. Usare l'output di log in formato CSV

Includere csvlog nell'elenco log_destination fornisce un modo conveniente di importare i file di log in una tabella del database. Questa opzione emette linee di log in formato CSV (valori separati da virgole), con queste colonne: timestamp con millisecondi, nome utente, nome del database, ID del processo, host client:numero della porta, ID della sessone, numero di linea per sessione, tag del comando, orario d'avvio della sessione, ID della transazione virtuale, ID della transazione regolare, severità dell'errore, codice SQLSTATE, messaggio d'errore, dettagli del messaggio d'errore, suggerimento, query interna che ha causato l'errore (se presente), character count of the error position therein, error context, user query that led to the error (if any and enabled by log_min_error_statement), character count of the error position therein, location of the error in the PostgreSQL source code (if log_error_verbosity is set to verbose), and application name. Ecco una semplice definizione di tabella per salvare output di log in formato CSV:

CREATE TABLE postgres_log
(
  log_time timestamp(3) with time zone,
  user_name text,
  database_name text,
  process_id integer,
  connection_from text,
  session_id text,
  session_line_num bigint,
  command_tag text,
  session_start_time timestamp with time zone,
  virtual_transaction_id text,
  transaction_id bigint,
  error_severity text,
  sql_state_code text,
  message text,
  detail text,
  hint text,
  internal_query text,
  internal_query_pos integer,
  context text,
  query text,
  query_pos integer,
  location text,
  application_name text,
  PRIMARY KEY (session_id, session_line_num)
);

Per importare un file di log in questa tabella, usare il comando COPY FROM:

COPY postgres_log FROM '/full/path/to/logfile.csv' WITH csv;

Ci sono poche altre cose da fare per simplificare l'importazione dei file di log CSV:

  1. Impostare log_filename e log_rotation_age per fornire uno schema di nomi consistente e prevedibile per i propri file di log. Questo ti permette di predirre quello che sarà il nome del file e sapere quando un file di log individuale è completo e pronto ad essere importato.

  2. Impostare log_rotation_size a 0 per disabilitare la rotazione dei log basata sulla dimensione, dato che rende difficile predirre il nome del file.

  3. Impostare log_truncate_on_rotation a on così che i vecchi dati di log non siano mescolati con i nuovi nello stesso file.

  4. La definizione della tabella sopra include la specificazione di una chiave primaria. Questo è utile per protezione contro l'importazione accidentale delle stesse informazioni due volte. Il comando COPY fa un commit di tutti i dati che importa in una volta, quindi qualsiasi errore causerà il fallimento dell'intera importazione. Se si importa un file di log parziale e successivamente si importa di nuovo il file quando è completo, la violazione della chiave primaria causerà il fallimento dell'importazione. Aspettare finchè il log è completo e chiuso prima di effettuare l'importazione. Questa procedura proteggerà inoltre rispetto all'importazione accidentale di linee parziali che non sono state scritte completamente, che farà anche fallire il comando COPY.

Documentazione di PostgreSQL 9.0 > Amministrazione del server > Configurazione del server > Log e presentazione degli errori
PrecedenteQuery PlanningStatistiche durante l'esecuzioneSuccessivo