Su qualsiasi Linux moderno, un servizio che non parte ha già scritto esattamente perché. Sta nel journal, e il motivo per cui la gente dice che nei log non c'è niente è che ha lanciato journalctl senza argomenti e si è arresa davanti alla mole.

Le cinque che fanno il lavoro

journalctl -u nginx -n 50 --no-pager   # the last 50 lines for one unit
journalctl -u nginx -f                # follow it live
journalctl -u nginx --since "10 min ago"
journalctl -p err -b                  # errors only, this boot
journalctl -b -1                      # the boot BEFORE this one
-b -1 è quella a cui allungare la mano dopo un riavvio inspiegato: mostra che cosa stava dicendo la macchina appena prima di cadere, e il boot attuale non lo contiene.

Quando un servizio non parte

systemctl status app --no-pager -l
journalctl -u app -n 100 --no-pager

status mostra il codice di uscita e le ultime righe; il journal mostra il resto. Una unit che fallisce subito è quasi sempre un percorso, un permesso o una porta già occupata, e tutte e tre lo dicono a chiare lettere.

Il journal su disco

Di default può essere volatile: tenuto in memoria e perso al riavvio, cioè proprio quando le serve. Lo renda persistente.

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
journalctl --disk-usage

Impedirgli di riempire il disco

# /etc/systemd/journald.conf
SystemMaxUse=500M
MaxRetentionSec=1month
Un'applicazione che scrive un file proprio - i log di accesso di Nginx, gli slow log di PHP-FPM - non è nel journal. Quelli stanno in /var/log e ruotano a parte; veda la rotazione dei log.