Logs error matcher

Paste a log and see which lines are known errors, what each one means and what to do first. The log is masked and matched in this browser: IP addresses, e-mails, tokens and passwords never reach the screen, and nothing is sent.

Stays in your browser. What you paste or choose is read on this page only. It is not sent to a server, not saved in the link or in browser storage, and never part of analytics.

Paste the text, or choose a file from your computer. Up to 8192 KiB.

0 of 8192 KiB

What it does

It reads a log line by line and recognizes the errors that stop or break self-hosted services most often: Docker (a port already allocated, the daemon or its socket, an image for another CPU, a missing command, an image that cannot be pulled, no network ranges left), PostgreSQL and MariaDB / MySQL (logins, roles, connections, data from another version, two servers on one data directory), nginx and Caddy (upstreams refused, timed out or not found, configuration errors), certificates (ACME validation, rate limits, expired or untrusted certificates), Node.js and Python (missing modules, the heap limit, Gunicorn timeouts) and Linux itself (the OOM killer, a full disk, a port in use, refused connections, names that do not resolve, read-only file systems, open file limits, permissions). Each error comes with what it means, what to do first, the official documentation, and the wizard or tool of this site that continues from it.

How it works

  1. Paste the log or choose a file, up to 8 MiB. It is read on this page in a background worker, so the page stays responsive on a long log; nothing is uploaded, stored or sent to analytics.
  2. The log is masked first: IP addresses (except 0.0.0.0, loopback and netmasks), e-mail addresses, tokens and keys, passwords in URLs and values of variables whose names look like secrets. Everything shown, copied, downloaded or handed off comes from the masked log.
  3. Each line is compared with a fixed list of known errors, written as patterns that cannot run away on a long or hostile line. The first, most specific match explains the line: an nginx line that says a port is in use is explained as a port in use.
  4. The result groups the lines by error, with their line numbers, so you can find them in the original. The same log always gives the same result.

Example

The log of a small Compose stack: the database rejects the app's password, the app tries localhost instead of the database service, then runs out of heap, and nginx answers 502.

Input
docker-compose.log
db-1     | 2026-10-12 08:14:03.512 UTC [1] LOG:  database system is ready to accept connections
db-1     | 2026-10-12 08:14:09.877 UTC [68] FATAL:  password authentication failed for user "app"
app-1    | Error: connect ECONNREFUSED 127.0.0.1:5432
app-1    |     at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1611:16)
app-1    | notify: sending alert to [email protected]
app-1    | FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
proxy-1  | 2026/10/12 08:15:01 [error] 29#29: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 203.0.113.7, server: example.com, request: "GET / HTTP/1.1", upstream: "http://172.18.0.4:3000/", host: "example.com"

What the matcher finds (masked):

  1. PostgreSQL rejected the password

    PostgreSQL1 line(s)

    The server checked the password and it did not match the role's. With the official image, a common cause: POSTGRES_PASSWORD was changed after the data directory was created, and it is read only on the first start.

    What to do: Use the password the data directory was created with, or change it inside the database (ALTER ROLE <user> PASSWORD '...'). Removing the volume resets it, and deletes the data.

    2db-1 | 2026-10-12 08:14:09.877 UTC [68] FATAL: password authentication failed for user "app"

    Sources: PostgreSQL Docs: Authentication problems · PostgreSQL Docs: The pg_hba.conf file · Docker Official Image: postgres

  2. Connection refused

    Linux1 line(s)

    The address was reached but nothing listens on that port: the service is down or not started yet, or it listens on another port or address. Inside a container, localhost and 127.0.0.1 are the container itself, not the host or another service.

    What to do: Use the other service's Compose name instead of localhost, wait for it with a healthcheck, and check the port it listens on.

    3app-1 | Error: connect ECONNREFUSED 127.0.0.1:5432

    Sources: Node.js: Common system errors · Docker Docs: Networking in Compose · Docker Docs: Control startup and shutdown order in Compose

  3. Node.js: heap limit reached

    Node.js1 line(s)

    The process used all the JavaScript heap V8 allows and aborted. The limit is set by Node.js, separately from the container's memory limit; a memory leak reaches it too.

    What to do: Check whether memory grows over time (a leak). Set --max-old-space-size (in MiB) below the container's memory limit, for example through NODE_OPTIONS.

    6app-1 | FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory

    Sources: Node.js: --max-old-space-size · Docker Docs: Resource constraints, memory

  4. nginx: the upstream refused the connection

    nginx1 line(s)

    nginx reached the upstream's address but nothing listens on that port: the application is down, restarting, or listens on another port or only on 127.0.0.1 inside its container. The visitor gets a 502.

    What to do: Check that the application is running (docker compose ps), that it listens on 0.0.0.0 and on the port in proxy_pass, and test it from the proxy's container.

    7proxy-1 | 2026/10/12 08:15:01 [error] 29#29: *1 connect() failed (111: Connection refused) while connecting to upstream, client: •••.•••.•••.•••, server: example.com, request: "GET / HTTP/1.1", upstream: "http://•••.•••.•••.•••:3000/", host: "example.com"

    Sources: nginx: ngx_http_proxy_module · Docker Docs: Networking in Compose

Limits

  • It recognizes known messages, not causes: one line can be the symptom of an error that a different program logged earlier. Read the lines around each match.
  • Only the errors in the list are recognized; a message reworded by a new version may be missed until the list is updated. It is not a log analysis or monitoring system.
  • Masking finds common formats of addresses and secrets and can miss others (a host name, a customer id, a secret in an unusual format). Read the masked log before you share it.
  • Nothing is sent to an AI model or a server: the explanations are fixed texts, the same for everyone.

Methodology: how the numbers are worked out

Sources

  1. Docker Docs: Port publishing and mapping
  2. ss(8), Linux manual page
  3. Docker Docs: Linux post-installation steps (manage Docker as a non-root user)
  4. Docker Docs: Troubleshooting the Docker daemon
  5. Docker Docs: Multi-platform builds
  6. Dockerfile reference: CMD
  7. Dockerfile reference: ENTRYPOINT
  8. Docker Docs: docker image pull
  9. Docker Docs: docker login
  10. Docker Docs: dockerd, daemon configuration file
  11. Docker Docs: Prune unused Docker objects
  12. PostgreSQL Docs: Authentication problems
  13. PostgreSQL Docs: The pg_hba.conf file
  14. Docker Official Image: postgres
  15. PostgreSQL Docs: Database roles
  16. PostgreSQL Docs: Upgrading a PostgreSQL cluster
  17. PostgreSQL Docs: Connections and authentication (max_connections)
  18. PostgreSQL Docs: Starting the database server (client connection problems)
  19. Docker Docs: Control startup and shutdown order in Compose
  20. MySQL 8.4 Reference Manual: Troubleshooting problems connecting to MySQL
  21. Docker Official Image: mariadb
  22. MySQL 8.4 Reference Manual: Can't connect to [local] MySQL server
  23. MySQL 8.4 Reference Manual: Running multiple MySQL instances on one machine
  24. nginx: ngx_http_proxy_module
  25. Docker Docs: Networking in Compose
  26. nginx: ngx_http_upstream_module
  27. Caddy Docs: Command line (caddy validate, caddy adapt)
  28. Caddy Docs: The Caddyfile
  29. Let's Encrypt: Rate limits
  30. Let's Encrypt: Challenge types
  31. Let's Encrypt: Certificate Authority Authorization (CAA)
  32. Caddy Docs: Automatic HTTPS
  33. Certbot User Guide
  34. OpenSSL: openssl-s_client
  35. update-ca-certificates(8), Debian manual page
  36. Node.js: NODE_EXTRA_CA_CERTS
  37. Node.js: Modules, loading from node_modules folders
  38. npm Docs: npm ci
  39. Node.js: --max-old-space-size
  40. Docker Docs: Resource constraints, memory
  41. Python Docs: ModuleNotFoundError
  42. pip User Guide: Requirements files
  43. Gunicorn Docs: Settings, timeout
  44. Linux kernel: Control Group v2, memory
  45. df(1), Linux manual page
  46. errno(3), Linux manual page
  47. Node.js: Common system errors
  48. Node.js: DNS, implementation considerations
  49. resolv.conf(5), Linux manual page
  50. mount(8), Linux manual page
  51. Docker Docs: Bind mounts
  52. getrlimit(2), Linux manual page
  53. Docker Docs: docker container run, --ulimit
  54. nginx: Command-line parameters (nginx -t)

Updated

Next step

Container keeps restarting: find the cause from its exit code

A free public tool by ANAROQ, a company building compute infrastructure. What ANAROQ is building