All Tools View Categories About Contact Privacy

PostgreSQL Log Parser

Severity counts, normalized error groups, and slow statements.

Runs entirely in your browser — your logs never leave this page.
0
Lines parsed
0
Errors
0
Warnings
0
Unparsed

  

About PostgreSQL Log Parser

PostgreSQL logs are verbose but parseable. PostgreSQL Log Parser reads each line’s timestamp, PID, session user and database, severity, and message, then organizes the file into severity counts, normalized error groups, the slowest statements, and activity per database and user.

Routine LOG and NOTICE traffic is separated from real failures, while ERROR and FATAL entries are grouped so the same underlying problem is counted once — not repeated hundreds of times.

Features

  • Full line parsing — time, PID, user, database, level, message.
  • Severity tally — errors vs warnings vs routine logs.
  • Normalized error grouping — noise masked.
  • Slow statement ranking — duration extraction.
  • Per-database and per-user breakdown.
  • Local only — nothing uploaded.

How to Use

  1. Paste your postgres log — the standard timestamp timezone [pid] user@database LEVEL: message line shape. Lines missing the user/database segment (background workers, startup messages) are still parsed, just without those two fields.
  2. Set the group depth if you want to see further down the ranked lists than the default top 10 — handy on a busy log with a long tail of distinct error patterns.
  3. Click Parse log. Every line is classified by severity, and ERROR/FATAL/PANIC/WARNING messages are additionally normalized and grouped so the same underlying failure is counted once.
  4. Drill into error patterns first, then check slow statements if log_min_duration_statement or log_duration was enabled for that log, then check the per-database/per-user breakdown to see where the activity is concentrated.
  5. Copy the report for a ticket or an incident writeup.

Examples

Example 1 — Constraint storm. A schema change breaks inserts; hundreds of ERROR: null value in column "x" violates not-null constraint lines collapse into one group with a count, because the normalizer replaces every quoted identifier with a placeholder before grouping — so the pattern reads the same whether the failing column is "email" or "customer_id".

Example 2 — Slow reporting query. duration: 15200.123 ms lines rank the offending statements with the database and user that ran them, so a report-generation job that quietly got slower over time surfaces at the top of the slow-statement list instead of hiding among thousands of routine LOG lines.

Example 3 — Auth failures. Repeated password authentication failed for user "x" entries group by pattern (with the username masked out) while the per-database breakdown shows which cluster is under attack — a sudden count of grouped auth failures against one database is a strong signal of credential stuffing or a misconfigured client retrying with a stale password.

Example 4 — Noise filtering. A busy production log can be 95% routine LOG: statement: lines; because only ERROR/FATAL/PANIC/WARNING lines are grouped and counted toward the error patterns section, that routine traffic never crowds out the handful of lines that actually need attention.

Benefits

  • Signal separation — real failures vs routine logs.
  • Error pattern groups — one count per root cause.
  • Performance view — slowest statements ranked.
  • Context fields — user, database, PID preserved.
  • Private — all processing client-side.

Frequently Asked Questions

What does a PostgreSQL log line look like?
The standard csvlog-adjacent format is <code>2025-06-11 14:00:00.123 UTC [12345] app_user@mydb LOG: message</code> — timestamp, timezone, PID, session user and database, severity level, and the message. Lines without the user/database fields are handled too.
What severity levels are recognized?
LOG, STATEMENT, ERROR, FATAL, WARNING, NOTICE, INFO, HINT, DETAIL, and PANIC. Errors and fatal errors are tallied separately so a working log with routine notices is not drowned in noise.
How are repeated errors grouped?
Messages are normalized first — quoted identifiers, numbers, and PIDs become placeholders — then identical patterns collapse into one group with a count and a sample line.
Does it surface slow statements?
Yes. When logging_duration is on, lines carry <code>duration: 2.510 ms</code>; those are extracted and ranked, showing the slowest statements with their database and user.
Is my data uploaded?
No. Parsing runs entirely in your browser.