Logging¶
Dokumenttyp: Developer Playbook
Status: Draft v0.2
Stand: 2026-06-30
Prinzip: Allgemeine Anleitung mit Praxisbeispiel aus Immohai
Ziel¶
Dieses Dokument erklärt, was Logging ist, warum Logs für Webprojekte wichtig sind und wie typische Logs auf einem Ubuntu-Server mit Docker, Docker Compose und Nginx geprüft werden.
Logging bedeutet: Ereignisse, Warnungen und Fehler werden gespeichert, damit man später nachvollziehen kann, was passiert ist.
Kurz erklärt¶
Logs sind Protokolle.
Ein Log beantwortet Fragen wie:
Was ist passiert?
Wann ist es passiert?
Welcher Dienst war betroffen?
Welche Fehlermeldung wurde erzeugt?
Welche Anfrage kam beim Server an?
Beispiele:
- Container startet nicht.
- Nginx liefert
502 Bad Gateway. - HTTPS-Zertifikat kann nicht erneuert werden.
- Eine Datei wird nicht gefunden.
- Eine App gibt einen Fehler aus.
Warum Logging wichtig ist¶
Ohne Logs sieht man oft nur:
Die Website geht nicht.
Mit Logs kann man herausfinden:
Der Container läuft nicht.
Nginx findet den lokalen Port nicht.
Die App wirft einen Fehler.
Das Zertifikat ist abgelaufen.
Eine Datei fehlt.
Logs sind deshalb ein zentrales Werkzeug für Fehlersuche und Betrieb.
Monitoring und Logging¶
Monitoring und Logging sind nicht dasselbe.
| Begriff | Bedeutung |
|---|---|
| Monitoring | Prüft, ob etwas funktioniert |
| Logging | Zeigt, was passiert ist |
Einfach gesagt:
Monitoring sagt: Es gibt ein Problem.
Logging hilft zu verstehen: Warum gibt es das Problem?
Beispiel:
Monitoring:
https://immohai.ohaisoft.com antwortet nicht.
Logging:
Nginx-Log zeigt 502 Bad Gateway.
Docker-Log zeigt, dass der Container gestoppt ist.
Typische Log-Quellen¶
Bei einem kleinen Docker-/Nginx-Setup sind vor allem diese Log-Quellen wichtig:
| Quelle | Zweck |
|---|---|
| Docker Logs | Ausgaben einzelner Container |
| Docker Compose Logs | Logs aller Dienste eines Projekts |
| Nginx Access Log | eingehende HTTP-/HTTPS-Anfragen |
| Nginx Error Log | Fehler von Nginx |
| Systemd Journal | Systemdienst-Logs, z. B. Nginx oder Docker |
| Certbot Logs | Zertifikats- und Renewal-Probleme |
| App Logs | anwendungsspezifische Fehler |
Grundprinzip der Fehlersuche¶
Bei Problemen sollte von außen nach innen geprüft werden.
öffentliche URL
↓
Nginx
↓
lokaler Port
↓
Docker-Container
↓
App
↓
Dateien / Konfiguration
Dazu passen die Logs:
Nginx Error Log
↓
Docker Compose Logs
↓
App Logs
Docker-Logs anzeigen¶
Alle laufenden Container anzeigen:
docker ps
Logs eines Containers anzeigen:
docker logs <container-name>
Beispiel:
docker logs immohai-web
docker logs immohai-docs
docker logs developer-playbook-docs
Nur die letzten 100 Zeilen anzeigen:
docker logs immohai-web --tail=100
Logs live verfolgen:
docker logs immohai-web -f
Docker Compose Logs anzeigen¶
Im Projektordner:
docker compose logs
Logs eines bestimmten Dienstes:
docker compose logs <service>
Beispiel:
docker compose logs docs
docker compose logs web
Letzte 100 Zeilen:
docker compose logs docs --tail=100
Live verfolgen:
docker compose logs docs -f
Docker Compose Status prüfen¶
Logs allein reichen nicht immer.
Zusätzlich prüfen:
docker compose ps
Allgemeine Containerübersicht:
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"
Wenn ein Container nicht läuft, zuerst die Logs des Containers prüfen.
Nginx Access Log¶
Der Nginx Access Log zeigt eingehende Anfragen.
Pfad:
/var/log/nginx/access.log
Letzte 100 Zeilen anzeigen:
sudo tail -n 100 /var/log/nginx/access.log
Live verfolgen:
sudo tail -f /var/log/nginx/access.log
Typische Informationen:
- IP-Adresse des anfragenden Clients
- Zeitpunkt
- HTTP-Methode
- URL
- HTTP-Statuscode
- User-Agent
Beispielhafte Statuscodes:
| Status | Bedeutung |
|---|---|
200 |
erfolgreich |
301 |
Weiterleitung |
403 |
verboten |
404 |
nicht gefunden |
500 |
Serverfehler |
502 |
Bad Gateway |
504 |
Gateway Timeout |
Nginx Error Log¶
Der Nginx Error Log ist bei Problemen meistens wichtiger als der Access Log.
Pfad:
/var/log/nginx/error.log
Letzte 100 Zeilen anzeigen:
sudo tail -n 100 /var/log/nginx/error.log
Live verfolgen:
sudo tail -f /var/log/nginx/error.log
Typische Fehler:
| Fehler | Bedeutung |
|---|---|
connect() failed |
Nginx erreicht den lokalen Dienst nicht |
connection refused |
Zielport ist nicht offen |
host not found |
Zielhost oder DNS nicht gefunden |
permission denied |
Rechteproblem |
upstream timed out |
lokaler Dienst antwortet nicht rechtzeitig |
Nginx Systemdienst-Logs¶
Zusätzlich zu den Nginx-Dateilogs kann das Systemd Journal geprüft werden.
Status:
sudo systemctl status nginx
Journal:
sudo journalctl -u nginx --no-pager -n 100
Live verfolgen:
sudo journalctl -u nginx -f
Docker Systemdienst-Logs¶
Docker selbst ist ein Systemdienst.
Status prüfen:
sudo systemctl status docker
Logs anzeigen:
sudo journalctl -u docker --no-pager -n 100
Live verfolgen:
sudo journalctl -u docker -f
Certbot Logs¶
Certbot-Probleme treten meist bei HTTPS-Einrichtung oder Zertifikatserneuerung auf.
Zertifikate anzeigen:
sudo certbot certificates
Renewal testen:
sudo certbot renew --dry-run
Certbot-Logs liegen typischerweise unter:
/var/log/letsencrypt/
Letzte Certbot-Logeinträge anzeigen:
sudo ls -la /var/log/letsencrypt
sudo tail -n 100 /var/log/letsencrypt/letsencrypt.log
Logs nach Neustart prüfen¶
Nach einem Neustart von Containern oder Diensten sollten die Logs kurz geprüft werden.
Docker Compose:
docker compose restart
docker compose ps
docker compose logs --tail=100
Nginx:
sudo nginx -t
sudo systemctl reload nginx
sudo journalctl -u nginx --no-pager -n 50
Certbot:
sudo certbot renew --dry-run
Praxisbeispiel Developer Playbook¶
Projektordner:
/home/fober/workspace/developer-playbook
Container:
developer-playbook-docs
Prüfen:
cd /home/fober/workspace/developer-playbook
docker compose ps
docker compose logs docs --tail=100
curl -I http://127.0.0.1:8100
curl -I https://playbook.ohaisoft.com
Wenn die öffentliche URL nicht funktioniert, zusätzlich prüfen:
sudo tail -n 100 /var/log/nginx/error.log
sudo journalctl -u nginx --no-pager -n 100
Praxisbeispiel Immohai¶
Projektordner:
/home/fober/projects/immohai
Container:
immohai-web
immohai-docs
Prüfen:
cd /home/fober/projects/immohai
docker compose ps
docker compose logs web --tail=100
docker compose logs docs --tail=100
curl -I http://127.0.0.1:8200
curl -I http://127.0.0.1:8201
curl -I https://immohai.ohaisoft.com
curl -I https://docs.immohai.ohaisoft.com
Wenn die öffentliche URL nicht funktioniert:
sudo nginx -t
sudo tail -n 100 /var/log/nginx/error.log
sudo journalctl -u nginx --no-pager -n 100
Typischer Prüfablauf bei Fehlern¶
Wenn eine Website nicht erreichbar ist:
curl -I https://app.example.com
Wenn Fehler:
sudo nginx -t
sudo tail -n 100 /var/log/nginx/error.log
Dann lokalen Dienst prüfen:
curl -I http://127.0.0.1:<lokaler-port>
Dann Container prüfen:
docker ps
docker compose ps
docker compose logs --tail=100
Dann System prüfen:
df -h
free -h
sudo systemctl status docker
sudo systemctl status nginx
Typische Fehlerbilder¶
502 Bad Gateway¶
Bedeutung:
Nginx ist erreichbar, aber der lokale Dienst dahinter nicht.
Prüfen:
sudo tail -n 100 /var/log/nginx/error.log
curl -I http://127.0.0.1:<lokaler-port>
docker compose ps
docker compose logs --tail=100
Typische Ursachen:
- Container läuft nicht.
proxy_passzeigt auf falschen Port.- App im Container ist abgestürzt.
- Port-Mapping ist falsch.
404 Not Found¶
Bedeutung:
Der Server antwortet, aber der angefragte Pfad oder Inhalt wurde nicht gefunden.
Prüfen:
sudo tail -n 100 /var/log/nginx/access.log
sudo tail -n 100 /var/log/nginx/error.log
Typische Ursachen:
- falscher Pfad
- falsche Nginx-Konfiguration
- fehlende Datei
- falsches Volume
403 Forbidden¶
Bedeutung:
Zugriff ist verboten.
Typische Ursachen:
- Rechteproblem
- Nginx darf Datei nicht lesen
- falscher Root-Pfad
- Verzeichnislisting nicht erlaubt
Certbot Renewal Fehler¶
Prüfen:
sudo certbot renew --dry-run
sudo tail -n 100 /var/log/letsencrypt/letsencrypt.log
Typische Ursachen:
- Port
80nicht erreichbar - DNS falsch
- Nginx-Konfiguration fehlerhaft
- Domain zeigt nicht auf den Server
Logs und Datenschutz¶
Logs können sensible Informationen enthalten.
Mögliche Inhalte:
- IP-Adressen
- URLs
- Query-Parameter
- User-Agent
- Fehlermeldungen
- technische Pfade
Deshalb:
- Logs nicht unüberlegt veröffentlichen.
- Logs nicht vollständig in öffentliche Dokumentation kopieren.
- Keine Tokens oder Passwörter in URLs verwenden.
- Bei Fehleranalysen sensible Daten anonymisieren.
- Logs nicht in Git committen.
Logs und Speicherplatz¶
Logs können wachsen und Speicherplatz belegen.
Speicher prüfen:
df -h
Loggrößen grob prüfen:
sudo du -sh /var/log/*
Docker-Speicher prüfen:
docker system df
Nicht blind löschen.
Zuerst verstehen, welche Logs groß sind und warum.
Logrotation¶
Ubuntu verwendet normalerweise logrotate, um Logs zu rotieren und alte Logs zu komprimieren.
Prüfen:
ls -la /etc/logrotate.d/
Für Nginx gibt es typischerweise eine eigene Logrotate-Konfiguration.
cat /etc/logrotate.d/nginx
Für kleine Projekte reicht die Standardkonfiguration meist aus.
Einfache Logging-Routine¶
Empfehlung für kleine Projekte:
| Anlass | Prüfung |
|---|---|
| nach Änderung an Docker Compose | docker compose logs --tail=100 |
| nach Änderung an Nginx | sudo nginx -t und Nginx Error Log |
| nach Certbot | sudo certbot renew --dry-run |
| bei öffentlichem Fehler | Nginx Error Log und Docker Logs |
| wöchentlich | Speicherplatz und auffällige Logs prüfen |
Best Practices¶
- Bei Fehlern zuerst die passende Log-Ebene prüfen.
- Nginx Error Log bei öffentlichen Fehlern zuerst lesen.
- Docker Compose Logs bei Containerproblemen zuerst lesen.
- Logs nicht vollständig in Dokumentation kopieren.
- Sensible Daten in Logs anonymisieren.
- Keine Logs mit Tokens oder Passwörtern committen.
- Speicherplatz regelmäßig prüfen.
- Logrotation nicht deaktivieren.
- Bei 502 immer lokalen Port und Containerstatus prüfen.
- Bei Certbot-Fehlern DNS, Port
80und Nginx prüfen.
Typische Fehler¶
| Fehler | Ursache | Lösung |
|---|---|---|
| keine Logs sichtbar | falscher Container oder Dienst | Containername prüfen |
| Logs zeigen nichts Neues | falscher Projektordner | in richtigen Compose-Ordner wechseln |
| 502 Bad Gateway | lokaler Dienst nicht erreichbar | Nginx Error Log und Docker Logs prüfen |
| 404 Not Found | falscher Pfad oder fehlende Datei | Access Log und Konfiguration prüfen |
| Certbot-Fehler | DNS oder HTTP-Challenge fehlerhaft | Let's-Encrypt-Log prüfen |
| Server voll | Logs oder Docker-Daten belegen Speicher | df -h und docker system df prüfen |
| sensible Daten in Logs | App schreibt Secrets aus | Logging-Konfiguration anpassen |
Checkliste¶
- [ ] Unterschied zwischen Monitoring und Logging verstanden
- [ ] Docker Logs bekannt
- [ ] Docker Compose Logs bekannt
- [ ] Nginx Access Log bekannt
- [ ] Nginx Error Log bekannt
- [ ] Systemd Journal bekannt
- [ ] Certbot Logs bekannt
- [ ] typischer Prüfablauf bei Fehlern bekannt
- [ ] 502-Fehlerbild verstanden
- [ ] 404-Fehlerbild verstanden
- [ ] Logs werden nicht in Git gespeichert
- [ ] sensible Logdaten werden geschützt
- [ ] Speicherplatz wird regelmäßig geprüft
- [ ] einfache Logging-Routine festgelegt