2009-04-06 19 views
281

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

cura (+ info) ho cambiato queste righe:

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

e riavviare il servizio PostgreSQL ... ma nessun registro è stato creato ... Sto utilizzando Windows Server 2003.

Qualche idea?

+8

Questo è importante: '' 'logging_collector = on''' – bonyiii

+0

Inoltre, fate attenzione che in alcune distribuzioni GNU/Linux (ad esempio Debian Jessie)' restart PostgreSQL systemctl 'potrebbe non riavviare il servizio PostgreSQL che hai configurato (non capisco perché ancora), quindi le modifiche nel file di configurazione non verranno applicate. È più sicuro usare 'pg_ctl' (o' pg_ctlcluster' su Debian). –

+3

Ho appena provato questo in Ubuntu 16.04 LTS, con PostgreSQL 9.5 e 'systemctl reload postgresql',' systemctl restart postgresql', 'service postgresql reload' e' service postgresql restart' rendono tutte le modifiche alla configurazione efficaci. –

risposta

368

Nel file data/postgresql.conf, modificare l'impostazione log_statement-'all'.


Modifica

Guardando le nuove informazioni, direi che ci possono essere alcune altre impostazioni per verificare:

  • assicurarsi di aver acceso la variabile log_destination
  • assicurati di accendere il logging_collector
  • assicurati anche che ilLa directoryesiste già all'interno della directory data e che l'utente postgres può scrivere su di essa.
+3

Quindi, curioso, significa che PostgreSQL non può abilitare la registrazione a meno che non riavvii 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 mandare un comando in esecuzione un comando per ricaricare la configurazione con 'pg_ctl reload' –

+7

PostgreSQL non ha un modo per cambiare la sua parametri tramite istruzioni SQL ancora (come da 9.2). La maggior parte dei parametri di logging può essere cambiata senza un riavvio completo del server, semplicemente eseguendo invece pg_ctl reload. Tuttavia, ci vuole un riavvio per cambiare logging_collector. –

18

+1 alle risposte di cui sopra. Io uso seguente configurazione

log_line_prefix = '%t %c %u ' # time sessionid user 
log_statement = 'all' 
31
SELECT set_config('log_statement', 'all', true); 

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

+5

È generalmente più pulito usare 'SET log_statement = 'all'' o (per il livello di transazione)' SET LOCAL log_statement =' all''. Potresti anche essere interessato alle impostazioni di 'client_min_messages' e' log_min_messages'. –

+1

Questo è fantastico, dal momento che voglio registrare solo i messaggi della mia connessione. Sfortunatamente ottengo: 'permesso negato di impostare il parametro" log_statement "' poiché il mio utente non è superutente. – guettli

+3

È possibile chiedere all'amministratore di DB le concessioni che eseguono la funzione. 'GRANT {EXECUTE | ALL [PRIVILEGES]} ON {FUNCTION nome_funzione ([[argmode] [nome_argo] arg_type [, ...]]) [, ...] | TUTTE LE FUNZIONI IN SCHEMA schema_name [, ...]} TO {[GROUP] role_name | PUBLIC} [, ...] [WITH GRANT OPTION] ' –

8

solo per avere maggiori dettagli per CentOS 6.4 (Red Hat 4.4.7-3) in esecuzione PostgreSQL 9.2, in base alle istruzioni trovate on this web page:

  1. Set (decommentare) log_statement = 'all' e log_min_error_statement = error in /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Ricarica la configurazione di PostgreSQL. Per me, questo è stato fatto eseguendo /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Trova registro di oggi a /var/lib/pgsql/9.2/data/pg_log/
+4

Non è necessario * restart * - un' pg_ctl reload' è sufficiente e non interrompe le connessioni. Non sono convinto che questa risposta aggiunga qualcosa a quelli già qui. –

+1

@CraigRinger Grazie per il commento, è un fatto abbastanza importante. Aggiornerò la risposta una volta che ho 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 esempio, le posizioni di postgresql.conf e dei file di registro). –

+1

@CraigRinger testato e aggiornato nella risposta. Grazie! –

22

È inoltre necessario aggiungere queste righe a 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

+0

Questa è la risposta più completa e diretta al punto. – Florent

+0

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

44

Modificare il /etc/postgresql/9.3/main/postgresql.conf, e modificare le linee come segue.

Nota: Se non avete trovato il file postgresql.conf, quindi basta digitare in un terminale $locate postgresql.conf

  1. #log_directory = 'pg_log'alog_directory = 'pg_log'

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

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

  4. #logging_collector = offalogging_collector = on

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

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

  7. interrogazione Fuoco in PostgreSQL select 2+2

  8. Trova registro corrente in /var/lib/pgsql/9.2/data/pg_log/

I file di log tendono a crescere molto più di un tempo, e potrebbe uccidere il vostro macchina. Per motivi di sicurezza, scrivi uno script bash che cancellerà i log e riavvierà il server postgresql.

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

7

FYI: Le altre soluzioni registrerà solo dichiarazioni dal default database di solito postgres -per registrare altri; inizia con la loro soluzione; poi:

ALTER DATABASE your_database_name 
SET log_statement = 'all'; 

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

Problemi correlati