Wie in jedem komplexen System gibt es auch in PostgreSQL Situationen, in denen irgendwas schief läuft: Queries brauchen zu lange, die Serverlast steigt und die User werden nervös. Logging ist der Weg, um das Innenleben der Datenbank zu beobachten, damit du:
- Langsame Queries findest – die, die deine App ausbremsen.
- Performance optimierst – indem du das Query-Verhalten analysierst.
- Fehler diagnostizierst – wie Constraint-Verletzungen oder falschen Syntax.
- Audit sicherstellst – nachverfolgst, wer was auf dem Server gemacht hat.
Wichtige Logging-Parameter
Die PostgreSQL-Konfigurationsdateien (postgresql.conf) enthalten viele Parameter rund ums Logging. Lass uns die wichtigsten anschauen.
log_statement– Logging von SQL-Queries
Der Parameter log_statement legt fest, welche SQL-Queries ins Log geschrieben werden. Er kann folgende Werte annehmen:
none– Logging von Queries ausschalten.ddl– nur Data Definition Commands loggen (z.B.CREATE,ALTER,DROP).mod– alle Befehle loggen, die Daten ändern (z.B.INSERT,UPDATE,DELETE).all– alle SQL-Queries loggen (inklusive einfacherSELECT).
Beispiel:
Um das Logging aller Queries zu aktivieren, setz in der postgresql.conf:
log_statement = 'all'
Wenn du nur Datenänderungen loggen willst:
log_statement = 'mod'
Nach der Änderung der Konfiguration vergiss nicht, den Server neu zu starten:
sudo systemctl restart postgresql
log_duration– Logging der Ausführungszeit
Der Parameter log_duration sorgt dafür, dass die Ausführungszeit jeder Query ins Log geschrieben wird. Das ist praktisch, um herauszufinden, welche Queries am meisten Zeit fressen.
Beispiel:
Um das Logging der Ausführungsdauer zu aktivieren, setz:
log_duration = on
Wenn du nur langsame Queries loggen willst, nutz den Parameter log_min_duration_statement (den schauen wir uns gleich an).
log_min_duration_statement– Logging von langsamen Queries
Mit diesem Parameter werden nur die Queries ins Log geschrieben, deren Ausführung länger als die angegebene Zeit (in Millisekunden) dauert. Super praktisch, um "Bremsen" in der Datenbank zu finden.
Beispiel:
Um Queries zu loggen, die länger als 1 Sekunde brauchen:
log_min_duration_statement = 1000
Wenn du ALLE Queries loggen willst, egal wie lange sie brauchen, setz einfach 0:
log_min_duration_statement = 0
Der Wert -1 schaltet das Duration-Logging aus.
log_line_prefix– Struktur der Log-Nachricht
Mit log_line_prefix kannst du das Format der Log-Nachrichten anpassen. Praktisch, um jedem Log-Eintrag Kontext zu geben (z.B. Username, PID, Datum und Uhrzeit).
Beispiel:
Um Username, Datenbank, Zeit und Prozess mitzuschreiben, nutz:
log_line_prefix = '%t [%p]: [%d]: [%u]: '
Hier steht:
%t– Zeit der Query.%p– Prozess-PID.%d– Name der Datenbank.%u– Username.
Alle verfügbaren Optionen findest du in der PostgreSQL-Doku.
logging_collector– Log-Sammler
Der Parameter logging_collector aktiviert das Schreiben der Logs in Dateien. Wenn er aus ist, gehen die Logs nur auf stdout, was oft unpraktisch ist.
Um den Log-Sammler zu aktivieren:
logging_collector = on
Vergiss nicht, das Log-Verzeichnis und den Dateinamen mit log_directory und log_filename anzugeben:
log_directory = '/var/log/postgresql'
log_filename = 'postgresql-%Y-%m-%d.log'
Praktische Nutzung der Parameter
Schauen wir uns an, wie du Logging-Parameter in echten Szenarien nutzt.
Szenario 1: Logging aller Queries
Wenn du gerade mit einer neuen Datenbank startest und alles sehen willst, was passiert, stell ein:
log_statement = 'all'
log_line_prefix = '%t [%p]: [%d]: [%u]: '
Jetzt wird jede Query, die in der DB läuft, ins Log geschrieben – super zum Debuggen!
Szenario 2: Langsame Queries finden
Wenn du merkst, dass der Server manchmal "lahmt" und du die Problem-Queries finden willst, stell ein:
log_min_duration_statement = 500 # Loggt Queries länger als 500 ms
log_line_prefix = '%t [%p]: [%d]: [%u]: [%r] '
Hier fügt %r die Client-IP hinzu. Nach dem Setup findest du schnell die Queries, die den Server stressen.
Szenario 3: Minimal-Logging-Modus
Wenn dein Server stabil läuft, du aber ein Minimal-Log fürs Auditing brauchst:
log_statement = 'mod'
log_duration = off
Hier werden nur Datenänderungen geloggt (z.B. INSERT, UPDATE).
Log-Analyse
Wenn die Logs sich mit Daten füllen, ist es wichtig, sie analysieren zu können! Du kannst:
Die Log-Datei im Texteditor öffnen:
cat /var/log/postgresql/postgresql.log
Tools wie grep nutzen, um langsame Queries zu finden:
grep "duration: " /var/log/postgresql/postgresql.log
Oder Tools für fortgeschrittene Log-Analyse wie pgBadger verwenden.
Nützliche Tipps
Zu detailliertes Logging kann die Festplatte belasten. Nutze in Produktivsystemen nur die Parameter, die du wirklich brauchst.
Lösch oder archivier regelmäßig alte Log-Dateien, damit die Platte nicht voll läuft.
Logging ist am effektivsten, wenn du nur die nötigen Daten sammelst. Zum Beispiel hilft log_min_duration_statement dabei, gezielt und ressourcensparend zu loggen.
Na, jetzt ist Logging in PostgreSQL für uns kein Problem mehr und wir können es easy für Query-Analyse und Performance-Tuning nutzen. Wie ein (oder mehrere) unbekannte, aber definitiv gute Entwickler mal sagten: "Logs sind unsere Chance, in die Vergangenheit der Queries zu schauen und die Zukunft der Datenbank zu fixen".
GO TO FULL VERSION