Come registrare le query PostgreSQL?


373

Come abilitare la registrazione di tutti gli SQL eseguiti da PostgreSQL 8.3?

Modificato (maggiori informazioni) Ho cambiato queste righe:

log_directory = 'pg_log'                    
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all'

E riavvia il servizio PostgreSQL ... ma non è stato creato alcun registro ... Sto usando Windows Server 2003.

Qualche idea?


15
Questo è importante:logging_collector = on
bonyiii

Inoltre, attenzione che su alcune distribuzioni GNU / Linux (ad esempio Debian Jessie) systemctl restart postgresqlpotrebbe non riavviare effettivamente il servizio PostgreSQL che hai configurato (non capisco perché), quindi le modifiche nel file di configurazione non verranno applicate. È più sicuro da usare pg_ctl(o pg_ctlclustersu Debian).
Skippy le Grand Gourou,

4
Ho appena provato questo in Ubuntu 16.04 LTS, con PostgreSQL 9.5, e systemctl reload postgresql, systemctl restart postgresql, service postgresql reloade service postgresql restarttutte le modifiche di configurazione rendo efficace.
Ben Johnson,

Risposte:


466

Nel tuo data/postgresql.conffile, modifica l' log_statementimpostazione su 'all'.


modificare

Guardando le tue nuove informazioni, direi che potrebbero esserci alcune altre impostazioni per verificare:

  • assicurati di aver attivato la log_destinationvariabile
  • assicurati di accendere il logging_collector
  • assicurati anche che la log_directorydirectory esista già all'interno della datadirectory e che l'utente postgres possa scrivergli.

3
Quindi, solo curioso, significa che PostgreSQL non può abilitare la registrazione se non riavvio il server? In MySQL, è semplice come "SET GLOBAL general_log = 'ON';"
Antony,

7
Io stesso non so se c'è un modo per farlo usando un'istruzione SQL come MySQL, ma puoi inviare a un server in esecuzione un comando per ricaricare la configurazione conpg_ctl reload
Jarret Hardie

9
PostgreSQL non ha ancora modo di modificare i suoi parametri tramite istruzioni SQL (a partire da 9.2). La maggior parte dei parametri di registrazione può essere modificata senza un riavvio completo del server, semplicemente eseguendo invece pg_ctl ricaricare. Tuttavia, è necessario riavviare per modificare logging_collector.
Greg Smith,

6
Con Postgres 9.4 e il nuovo ALTER SYSTEMcomando un superutente può impostare i parametri GUC da SQL.
Erwin Brandstetter,

6
La datadirectory citata nella risposta non è il suo nome letterale; si riferisce al percorso assegnato alla data_directoryvariabile nel file di configurazione PostgreSQL. Su Debian e Ubuntu GNU / Linux, questo file solitamente si trova /etc/postgresql/$v/main/postgresql.conf, dove si $vtrova la versione del server. Inoltre, sui sistemi summenzionati, quando log_destination = 'stderr', viene scritto l'output /var/log/postgresql/postgresql-$v-main.log, dov'è $vla versione del server (non in una posizione all'interno data_directory).
Ben Johnson,

104

Modifica il tuo /etc/postgresql/9.3/main/postgresql.confe cambia le linee come segue.

Nota : se non hai trovato il postgresql.conffile, digita semplicemente $locate postgresql.confun terminale

  1. #log_directory = 'pg_log' per log_directory = 'pg_log'

  2. #log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' per log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'

  3. #log_statement = 'none' per log_statement = 'all'

  4. #logging_collector = off per logging_collector = on

  5. Opzionale :SELECT set_config('log_statement', 'all', true);

  6. sudo /etc/init.d/postgresql restart o sudo service postgresql restart

  7. Interrogazione del fuoco in postgresql select 2+2

  8. Trova l'accesso corrente /var/lib/pgsql/9.2/data/pg_log/

I file di registro tendono a crescere molto nel tempo e potrebbero uccidere il computer. Per sicurezza, scrivi uno script bash che cancellerà i log e riavvierà il server postgresql.

Grazie @paul, @Jarret Hardie, @ Zoltán, @Rix Beck, @Latif Premani


2
A debian stretch, ho anche dovuto decommentare # log_destination = 'stderr'il file di configurazione prima che funzionasse.
phihag,

Ho seguito attentamente il tuo passaggio e non funziona. È necessario riavviare?
Yohanes AI,

2
se non vuoi scrivere uno script bash ma vuoi solo che i log vengano sovrascritti mensilmente, fai questo: log_filename = 'postgresql-%d.log'e no, non sovrascriverà dopo ogni riavvio, lo aggiungerà per ogni giorno e lo sovrascriverà ogni mese. Naturalmente ci sono giorni diversi a seconda del mese 28,29,30,31 - ma hai l'idea.
sojim2

44
SELECT set_config('log_statement', 'all', true);

Con un diritto utente corrispondente può utilizzare la query sopra dopo la connessione. Ciò influirà sulla registrazione fino al termine della sessione.


7
È generalmente più pulito da usare SET log_statement = 'all'o (a livello di transazione) SET LOCAL log_statement = 'all'. Potresti anche essere interessato alle impostazioni client_min_messagese log_min_messages.
Craig Ringer,

1
Questo è fantastico, dal momento che voglio registrare solo i messaggi della mia connessione. Sfortunatamente capisco: permission denied to set parameter "log_statement"dal momento che il mio utente non è un superutente.
Guettli,

3
È possibile richiedere all'amministratore di DB concessioni per l'esecuzione della funzione. GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ]
Rix Beck,

35

È inoltre necessario aggiungere queste righe in PostgreSQL e riavviare il server:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on

2
logging_collector = on è necessario
wjin

Funziona come un fascino. Ero confuso dal commento sul file di configurazione che diceva Required to be on for csvlogs, pensando che questa opzione fosse per registrare l'output della query e non solo le dichiarazioni, ma non è il caso.
Jacopofar,

Nel tuo file data / postgresql.conf, modifica l'impostazione log_statement su 'all'.
FlyingV

32

Cordiali saluti: Le altre soluzioni registreranno solo le istruzioni dal database predefinito — di solito postgres— per registrare gli altri; iniziare con la loro soluzione; poi:

ALTER DATABASE your_database_name
SET log_statement = 'all';

Rif: https://serverfault.com/a/376888 /log_statement



20

+1 alle risposte sopra. Uso la seguente configurazione

log_line_prefix = '%t %c %u ' # time sessionid user
log_statement = 'all'

10

Giusto per avere maggiori dettagli su CentOS 6.4 (Red Hat 4.4.7-3) che esegue PostgreSQL 9.2, in base alle istruzioni trovate in questa pagina Web :

  1. Set (decomment) log_statement = 'all'e log_min_error_statement = errorin /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Ricarica la configurazione di PostgreSQL. Per me, questo è stato fatto correndo /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Trova l'accesso di oggi /var/lib/pgsql/9.2/data/pg_log/

4
Non è necessario riavviare : a pg_ctl reloadè sufficiente e non interrompe le connessioni. Non convinto che questa risposta aggiunga qualcosa a quelli già qui.
Craig Ringer,

1
@CraigRinger Grazie per il commento, è un fatto abbastanza importante. Aggiornerò la risposta dopo aver provato il tuo suggerimento. Ho scritto questa risposta principalmente come riferimento per me stesso, perché all'epoca avevo pochissima esperienza con UNIX e volevo avere tutte le informazioni necessarie in un unico posto (ad es. Le posizioni di postgresql.conf e i file di registro).
Zoltán,

0

È inoltre necessario impostare questo parametro per registrare ogni istruzione:

log_min_duration_statement = 0

0

Stavo cercando di impostare il log_statementfile di configurazione in alcuni postgres ma in realtà il file non è stato letto dai nostri postgres.

Ho confermato che utilizzando la richiesta:

select *
from pg_settings

[...]
log_statement   none # That was not the value i was expected for !!!

Uso in questo modo https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.