Wie protokolliere ich PostgreSQL-Abfragen?

373

Wie aktiviere ich die Protokollierung aller von PostgreSQL 8.3 ausgeführten SQL?

Bearbeitet (weitere Informationen) Ich habe diese Zeilen geändert:

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

Und starten Sie den PostgreSQL-Dienst neu ... aber es wurde kein Protokoll erstellt ... Ich verwende Windows Server 2003.

Irgendwelche Ideen?

Paul
quelle
15
Dies ist wichtig:logging_collector = on
Bonyiii
Beachten Sie außerdem, dass auf einigen GNU / Linux-Distributionen (z. B. Debian Jessie) der von systemctl restart postgresqlIhnen konfigurierte PostgreSQL-Dienst möglicherweise nicht neu gestartet wird (ich verstehe noch nicht, warum), sodass Änderungen in der Konfigurationsdatei nicht übernommen werden. Es ist sicherer zu verwenden pg_ctl(oder pg_ctlclusterauf Debian).
Skippy le Grand Gourou
4
Getestet habe ich gerade dies in Ubuntu 16.04 LTS, mit PostgreSQL 9.5, und systemctl reload postgresql, systemctl restart postgresql, service postgresql reloadund service postgresql restartalle machen Konfigurationsänderungen wirksam.
Ben Johnson

Antworten:

465

data/postgresql.confÄndern Sie in Ihrer Datei die log_statementEinstellung in 'all'.


Bearbeiten

Wenn Sie sich Ihre neuen Informationen ansehen, würde ich sagen, dass möglicherweise einige andere Einstellungen überprüft werden müssen:

  • Stellen Sie sicher, dass Sie die log_destinationVariable aktiviert haben
  • Stellen Sie sicher, dass Sie die logging_collector
  • Stellen Sie außerdem sicher, dass das log_directoryVerzeichnis bereits im dataVerzeichnis vorhanden ist und dass der Benutzer von postgres darauf schreiben kann.
Jarret Hardie
quelle
3
Nur neugierig, bedeutet das, dass PostgreSQL die Protokollierung nur aktivieren kann, wenn ich den Server neu starte? In MySQL ist es so einfach wie "SET GLOBAL general_log = 'ON';"
Antony
7
Ich selbst weiß nicht, ob es eine Möglichkeit gibt, dies mit einer SQL-Anweisung wie MySQL zu tun, aber Sie können einem laufenden Server einen Befehl senden, um die Konfiguration mitpg_ctl reload
Jarret Hardie
9
PostgreSQL hat noch keine Möglichkeit, seine Parameter über SQL-Anweisungen zu ändern (Stand 9.2). Die meisten Protokollierungsparameter können ohne vollständigen Neustart des Servers geändert werden, indem stattdessen nur pg_ctl neu geladen wird. Es ist jedoch ein Neustart erforderlich, um logging_collector zu ändern.
Greg Smith
6
Mit Postgres 9.4 und dem neuen ALTER SYSTEMBefehl kann ein Superuser GUC-Parameter aus SQL festlegen.
Erwin Brandstetter
6
Das datain der Antwort angegebene Verzeichnis ist nicht der wörtliche Name. Es bezieht sich auf den Pfad, der der data_directoryVariablen in der PostgreSQL-Konfigurationsdatei zugewiesen ist . Unter Debian und Ubuntu GNU / Linux, diese Datei befindet sich in der Regel an /etc/postgresql/$v/main/postgresql.conf, wo $vder Server - Version. Außerdem wird auf den oben genannten Systemen, wenn log_destination = 'stderr'die Ausgabe geschrieben wird /var/log/postgresql/postgresql-$v-main.log, wo $vsich die Serverversion befindet (nicht an einem Ort innerhalb data_directory).
Ben Johnson
104

Bearbeiten Sie Ihre /etc/postgresql/9.3/main/postgresql.confund ändern Sie die Zeilen wie folgt.

Hinweis : Wenn Sie die postgresql.confDatei nicht gefunden haben , geben Sie einfach $locate postgresql.confein Terminal ein

  1. #log_directory = 'pg_log' zu log_directory = 'pg_log'

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

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

  4. #logging_collector = off zu logging_collector = on

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

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

  7. Feuerabfrage in postgresql select 2+2

  8. Aktuelle Anmeldung suchen /var/lib/pgsql/9.2/data/pg_log/

Die Protokolldateien wachsen im Laufe der Zeit stark und können Ihren Computer töten. Schreiben Sie zu Ihrer Sicherheit ein Bash-Skript, mit dem Protokolle gelöscht und der Postgresql-Server neu gestartet werden.

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

Vijay
quelle
2
Auf Debian Stretch musste ich auch # log_destination = 'stderr'in der Konfigurationsdatei auskommentieren, bevor dies funktionierte.
Phihag
Ich habe Ihren Schritt sorgfältig verfolgt und es funktioniert nicht. Muss es neu gestartet werden?
Yohanes AI
2
Wenn Sie kein Bash-Skript schreiben möchten, sondern nur möchten, dass die Protokolle monatlich überschrieben werden, gehen Sie folgendermaßen vor: log_filename = 'postgresql-%d.log'Nein, es wird nicht nach jedem Neustart überschrieben, es wird für jeden Tag angehängt und jeden Monat überschrieben. Natürlich gibt es je nach Monat 28,29,30,31 unterschiedliche Tage - aber Sie haben die Idee.
Sojim2
44
SELECT set_config('log_statement', 'all', true);

Mit einem entsprechenden Benutzerrecht kann die obige Abfrage nach dem Verbinden verwendet werden. Dies wirkt sich auf die Protokollierung aus, bis die Sitzung endet.

Rix Beck
quelle
7
Es ist im Allgemeinen sauberer zu verwenden SET log_statement = 'all'oder (für die Transaktionsebene) SET LOCAL log_statement = 'all'. Sie könnten auch an den Einstellungen client_min_messagesund interessiert sein log_min_messages.
Craig Ringer
1
Das ist großartig, da ich nur die Nachrichten meiner Verbindung protokollieren möchte. Leider bekomme ich: permission denied to set parameter "log_statement"da mein User kein Superuser ist.
Guettli
3
Sie können den DB-Administrator um Zuschüsse bitten, um die Funktion auszuführen. 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

Sie müssen diese Zeilen auch in PostgreSQL hinzufügen und den Server neu starten:

log_directory = 'pg_log'                    
log_filename = 'postgresql-dateformat.log'
log_statement = 'all'
logging_collector = on
Latif Premani
quelle
2
logging_collector = on ist notwendig
wjin
Klappt wunderbar. Ich war verwirrt von dem Kommentar in der Konfigurationsdatei, der besagte Required to be on for csvlogs, dass diese Option die Ausgabe von Abfragen und nicht nur Anweisungen protokollieren sollte, aber dies ist nicht der Fall.
Jacopofar
Ändern Sie in Ihrer Datei data / postgresql.conf die Einstellung log_statement in 'all'.
FlyingV
32

Zu Ihrer Information: Die anderen Lösungen protokollieren normalerweise nur Anweisungen aus der Standarddatenbank postgres, um andere zu protokollieren. Beginnen Sie mit ihrer Lösung. dann:

ALTER DATABASE your_database_name
SET log_statement = 'all';

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

BEIM
quelle
20

+1 zu den obigen Antworten. Ich benutze folgende Konfiguration

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

Weitere Informationen zu CentOS 6.4 (Red Hat 4.4.7-3), auf dem PostgreSQL 9.2 ausgeführt wird, basieren auf den Anweisungen auf dieser Webseite :

  1. Setze (Kommentar aus) log_statement = 'all'und log_min_error_statement = errorin /var/lib/pgsql/9.2/data/postgresql.conf.
  2. Laden Sie die PostgreSQL-Konfiguration neu. Für mich wurde dies durch Laufen gemacht /usr/pgsql-9.2/bin/pg_ctl reload -D /var/lib/pgsql/9.2/data/.
  3. Finden Sie das heutige Login /var/lib/pgsql/9.2/data/pg_log/
Zoltán
quelle
4
Sie müssen nicht neu starten - a pg_ctl reloadist ausreichend und unterbricht keine Verbindungen. Nicht überzeugt, dass diese Antwort etwas zu denen hinzufügt, die bereits hier sind.
Craig Ringer
1
@CraigRinger Danke für den Kommentar, das ist eine ziemlich wichtige Tatsache. Ich werde die Antwort aktualisieren, sobald ich Ihren Vorschlag ausprobiert habe. Ich habe diese Antwort hauptsächlich als Referenz für mich selbst geschrieben, da ich zu der Zeit nur sehr wenig Erfahrung mit UNIX hatte und alle erforderlichen Informationen an einem Ort haben wollte (z. B. die Speicherorte von postgresql.conf und die Protokolldateien).
Zoltán
0

Sie sollten diesen Parameter auch so einstellen, dass jede Anweisung protokolliert wird:

log_min_duration_statement = 0
H.Ç.T
quelle
0

Ich habe versucht log_statement, die Datei in einigen Postgres-Konfigurationsdateien festzulegen, aber tatsächlich wurde die Datei von unseren Postgres nicht gelesen.

Ich habe das mit der Anfrage bestätigt:

select *
from pg_settings

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

Ich benutze diesen Weg https://stackoverflow.com/a/41912295/2294168

command: postgres -c config_file=/etc/postgresql.conf
Ser
quelle