CodeGym /Kurse /SQL SELF /Query-Logging

Query-Logging

SQL SELF
Level 45 , Lektion 3
Verfügbar

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:

  1. Langsame Queries findest – die, die deine App ausbremsen.
  2. Performance optimierst – indem du das Query-Verhalten analysierst.
  3. Fehler diagnostizierst – wie Constraint-Verletzungen oder falschen Syntax.
  4. 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.

  1. 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 einfacher SELECT).

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
  1. 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).

  1. 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.

  1. 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.

  1. 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".

Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION