Guides

Step-by-step guides for getting logs off your servers and into one searchable place, then querying and alerting on them once they land.

Every guide covers three things: how to configure the source, how to ship the logs so a network blip does not lose them, and which queries are worth running on the result.

Running a homelab or a small rack? Start with Proxmox for the hypervisor and OPNsense, Synology and TrueNAS for the appliances that only speak syslog. Reading a Proxmox node’s logs where they sit? Checking Proxmox VE logs covers the journal, task logs, and why a failed scheduled backup never logs end task.

Logs already landing? Querying logs with SQL is where they start earning their keep.

No agent, just a script that prints things? Sending logs to a server with curl covers posting one line or a whole file over HTTP, and the four mistakes that make a failed upload look like a successful one.

Chasing a cron job instead? Cron job not running covers the file names, permissions and missing newline that make cron skip a job without a word. Checking cron logs covers where cron’s own log lives on each distribution and why it is so often empty, where cron job output goes covers keeping what a job printed, and monitoring cron jobs covers noticing when it stops printing anything at all.

Working with systemd? Viewing logs for a service with journalctl -u covers reading the journal, and saving journalctl output to a file covers getting it out of the journal without losing entries. journalctl printing nothing at all? “No journal files were found” covers the four different messages it uses to say that, and why three of them exit 0. A service that will not stay up? Why a systemd service failed to start reads systemctl status and journalctl -xeu, and decodes status=203/EXEC.

Narrowing the journal down? Viewing journalctl logs for a specific time range covers --since and --until and the midnight trap that quietly drops a day, showing only errors in journalctl covers -p err and why an application full of errors often returns nothing, and searching journalctl logs for a specific string covers -g, the case rule nobody expects, and the fields it cannot see. Only want the newest entries? Showing the last 100 lines in journalctl covers -n, why piping to grep gets the wrong 100, and why -g flips the order. Chasing the kernel? Viewing kernel logs with journalctl -k covers -k, why it hides everything before the last reboot even with --since, and why dmesg says “Operation not permitted”.

Tracking down a specific failure? Checking SSH logs on Linux covers auth.log, /var/log/secure and the journal, and why journalctl -t sshd finds no logins since OpenSSH 9.8. Checking failed SSH login attempts covers reading the auth log and counting attempts by source, checking Nginx error logs covers finding the file and raising the level when it looks empty, and viewing Docker container logs with docker logs covers tail, follow, grep and the three reasons it returns nothing. Need the file itself? Docker logs location covers where each driver keeps it, why LogPath is often empty, and saving logs to a file without losing stderr.

Reading a web server’s logs? Reading Nginx access logs covers the combined format field by field, the awk mistake that counts a 200 as a server error, and why half your requests can be missing from the file. Checking Apache error logs covers finding the file on each distribution, what LogLevel warn throws away, and the three places combined means three different things.

Parsing the journal, or reading one that came off another machine? Getting JSON output from journalctl covers -o json and the three cases where a value is not a string, including the one that turns your longest messages into null. Reading journal files from another server covers --file, -D and --root, and the four reasons a copied journal looks empty when it is not. Reading only what is new since last time? Using a journalctl cursor covers --cursor-file and --after-cursor, and the six ways a cursor repeats or loses entries.

Disk full? Fixing /var/log filling up covers finding what is using the space, including the deleted files du cannot see, and the logrotate settings that let it happen. Clearing journalctl logs and limiting journal disk usage covers vacuuming and the caps that keep it vacuumed, limiting Docker log size covers the container logs Docker never rotates by default, and alerting on a disk running out of space covers hearing about the next one at 85% instead of 100%. Server rebooted and nobody knows why? Finding out why a Linux server rebooted covers reading the previous boot, and what to do when there is no previous boot to read.

Want to hear about problems instead of going to look for them? Alerting on errors in your logs covers writing rules that actually fire, including the one nobody writes — alert when the logs stop. Seeing who logged in over SSH covers reading successful logins with last and the journal, and the two files that hide half of them.

No log server yet? Start with setting up a self-hosted logging server, then come back and pick a source.

Cron job not running? How to find out why

Oct 11, 2026

Find out why a cron job is not running on Debian, Ubuntu and RHEL: the cron.d file names cron ignores without a word, the missing newline that drops a whole file, the permission rules, and where the error went when the job did run.

How to fix /var/log filling up

Sep 20, 2026

Find what is filling /var/log, including the deleted files du cannot see, free the space without a reboot, and fix the logrotate config that let it happen.

journalctl: "No journal files were found"

Sep 20, 2026

journalctl has four ways of saying it found nothing, and three of them exit 0. Tell a missing journal from a blocked one from a filter that matched nothing, and fix each.

How to check Apache error logs

Sep 20, 2026

Find the Apache error log on any distribution, read the default line format, understand what LogLevel hides, and search every web server from one place.

How to read Nginx access logs

Sep 20, 2026

Find the Nginx access log, read the combined format field by field, count status codes without the awk mistake everyone makes, and query every web server at once.

How to send logs to a server with curl

Sep 13, 2026

Post one log line or a whole file to an HTTP ingest endpoint with curl, using the token in the URL or a Bearer header, with gzip, and with the error handling that stops a cron job losing its output quietly.

How to read journal files from another server

Sep 6, 2026

Open a copied .journal file with journalctl --file, a whole directory with -D, and a mounted root filesystem with --root, plus the boot-offset and permission traps that make it look empty.

How to get JSON output from journalctl

Sep 6, 2026

Use journalctl -o json for one object per line, and learn the three cases where a field is not a string: null over 4096 bytes, arrays for repeated fields, and byte arrays for binary data.

How to check Nginx error logs

Aug 30, 2026

Find the Nginx error log, read its format, raise the level when it is too quiet, and search errors across every web server from one place.

How to show only errors in journalctl

Aug 29, 2026

Filter the systemd journal with journalctl -p err, read the eight priority levels, understand why an application full of errors returns nothing, and alert on the errors that -p misses.

How to check cron logs on Linux

Aug 22, 2026

Find the cron log on Debian, Ubuntu and the RHEL family, read it with journalctl or grep, work out why it is empty, and see why the line that proves a job ran does not prove it worked.

How to find out why a Linux server rebooted

Aug 16, 2026

Use last reboot, journalctl --list-boots and -b -1 to read the previous boot, tell a clean shutdown from a panic, and see why the answer is often missing from the machine itself.

How to monitor website uptime from your own server

Aug 10, 2026

Self-hosted uptime checks run from a box you own, next to the logs from the outage. Here is how to set them up, why a 500 will not alert you until you add a keyword, and what to do about the one check your own server cannot make.

How to get alerted when errors appear in your logs

Aug 10, 2026

A log alert that never fires looks exactly like a healthy system. Here is how to write alert rules that match, how to alert on logs that stop arriving, and the mistakes that produce a rule which silently does nothing.

How to log cron job output to a file

Aug 7, 2026

Cron mails job output to a mailbox nobody reads. Here is where cron logs actually go on Linux, why /var/log/syslog does not have your output, and how to ship each run to a central log server as one searchable record.

How to query logs with SQL

Aug 7, 2026

Query your logs with SQL instead of grep: the logs table schema, json_extract on JSON log lines, counting and grouping errors, time buckets, full-text search, and the json_valid trap that silently truncates results.

Sending Node.js application logs to a central server

Aug 7, 2026

How to ship Node.js logs to a self-hosted central log server: structured JSON with pino, keeping stack traces on one line, shipping through journald or a batching transport, and SQL queries for the results.

Sending MySQL and MariaDB logs to a central server

Aug 7, 2026

How to ship MySQL and MariaDB slow query logs and error logs to a self-hosted central log server, including the multi-line problem the slow query log creates and how to get one row per query.

Sending Apache logs to a central server

Aug 7, 2026

How to ship Apache access and error logs to a self-hosted central log server: a JSON LogFormat, piped logging through syslog, an offset-tracking shipper, and SQL queries for the results.

Sending Kubernetes logs to a central server

Aug 7, 2026

Ship Kubernetes and k3s pod logs to a self-hosted central logging server with a Fluent Bit DaemonSet posting to an HTTP ingest endpoint, then query them with SQL.

Sending Caddy logs to a central server

Aug 7, 2026

Caddy already logs JSON. This guide enables access logging, ships it to a self-hosted central server through journald or a file, and gives the SQL queries worth running on it.

Sending Proxmox logs to a central server

Aug 7, 2026

Ship Proxmox VE node logs, task logs and guest logs to a self-hosted central server with the CL Agent, then alert when a backup job fails or a node stops checking in.

How to save journalctl output to a file

Aug 7, 2026

Redirect journalctl to a file, narrow it first with -u, --since and -p, pick an output format, and use --cursor-file so the second export does not repeat the first.

Sending PostgreSQL logs to a central server

Aug 7, 2026

Configure PostgreSQL CSV or JSON logging, ship the logs to a centralized logging server, and query them with SQL to find slow queries, deadlocks, and failed connections.

How to forward rsyslog logs to a remote server over HTTP (omhttp)

Aug 7, 2026

Forward rsyslog to a remote server over HTTP with omhttp, or with omprog on Debian and Ubuntu, which do not package omhttp. Which rsyslog versions drop a batch on a 5xx, why a wrong token loses logs silently, and the queue settings that keep them.

Sending Nginx logs to a central server

Aug 7, 2026

How to ship Nginx access and error logs to a centralized logging server: structured JSON log formats, syslog and journald forwarding, and SQL queries for the results.

💌 Get notified on new features and updates

Only sent when a new version is released. Nothing else.