Log-Dateien verwalten: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
Keine Bearbeitungszusammenfassung |
||
| Zeile 1: | Zeile 1: | ||
= Log-Dateien verwalten = | |||
Auf modernen Linux-Systemen gibt es zwei Log-Welten, die nebeneinander existieren: | |||
* '''systemd-journald''' – sammelt alles zentral in einem Binärformat, abgefragt mit <code>journalctl</code> | |||
* '''rsyslog''' – der klassische Syslog-Dienst, schreibt Textdateien nach <code>/var/log</code> und kann Meldungen über das Netz verschicken | |||
Wichtiger Unterschied zwischen den Kursmaschinen: | |||
{| class="wikitable" | |||
! System !! journald !! rsyslog | |||
|- | |||
| Rocky Linux || aktiv || installiert und aktiv, schreibt /var/log/messages und /var/log/secure | |||
|- | |||
| Debian (ab 12) || aktiv || nicht installiert, muss bei Bedarf nachinstalliert werden | |||
|} | |||
Deshalb findet man auf der Debian-Maschine kein <code>/var/log/syslog</code> mehr – die Meldungen sind trotzdem da, nur im Journal. | |||
== Ausgangslage prüfen == | |||
Zuerst auf '''beiden''' Maschinen nachsehen, wer überhaupt loggt. | |||
*systemctl status systemd-journald | |||
*systemctl status rsyslog | |||
*ls -l /var/log | |||
=== Aufgabe 1 === | |||
* Vergleiche den Inhalt von <code>/var/log</code> auf Rocky und auf Debian. | |||
* Welche Dateien gibt es nur auf Rocky? Woher kommen sie? | |||
* Prüfe auf beiden Systemen, ob der Dienst <code>rsyslog</code> existiert. | |||
== Das Journal abfragen == | |||
Das Journal wird nicht mit <code>cat</code> oder <code>tail</code> gelesen, sondern immer über <code>journalctl</code>. | |||
Grundlegende Aufrufe: | |||
*journalctl | |||
*journalctl -n 20 | |||
*journalctl -e | |||
*journalctl -b | |||
*journalctl -b -1 | |||
Die vier wichtigsten Optionen im Alltag: | |||
{| class="wikitable" | |||
! Option !! Bedeutung | |||
|- | |||
| <code>-u</code> || nur Meldungen einer bestimmten Unit | |||
|- | |||
| <code>-f</code> || mitlaufen lassen (wie <code>tail -f</code>) | |||
|- | |||
| <code>-g</code> || Volltextsuche im Meldungstext (grep, Regex) | |||
|- | |||
| <code>-k</code> || nur Kernel-Meldungen (entspricht <code>dmesg</code>) | |||
|} | |||
*journalctl -u sshd | |||
*journalctl -u sshd -f | |||
*journalctl -g "Failed password" | |||
*journalctl -g "error" -p err | |||
*journalctl -k | |||
*journalctl -k -b -1 | |||
Kombinieren lässt sich das beliebig: | |||
*journalctl -u sshd -g "Accepted" --since today | |||
*journalctl -f -u sshd -g "Failed" | |||
Zeitliche Eingrenzung: | |||
*journalctl --since "2026-08-25 08:00" | |||
*journalctl --since "1 hour ago" | |||
*journalctl --since yesterday --until today | |||
Nach Priorität filtern (0=emerg bis 7=debug): | |||
*journalctl -p warning | |||
*journalctl -p err -b | |||
Andere Ausgabeformate: | |||
*journalctl -u sshd -o verbose | |||
*journalctl -u sshd -o json-pretty | |||
*journalctl -u sshd -o short-iso | |||
=== Aufgabe 2 === | |||
* Melde dich von der anderen Maschine per SSH an – einmal erfolgreich, einmal mit falschem Passwort. | |||
* Lass dir auf der Zielmaschine in einem zweiten Terminal die SSH-Meldungen live mitlaufen. | |||
* Finde alle fehlgeschlagenen Anmeldungen des heutigen Tages mit einer einzigen Zeile. | |||
* Zeige alle Kernel-Meldungen des letzten Bootvorgangs an. | |||
* Suche im Journal nach dem Namen einer deiner Netzwerkkarten. | |||
== Das Journal persistent machen == | |||
Standardmäßig liegt das Journal auf Debian nur unter <code>/run/log/journal</code> und ist damit '''nach dem Reboot weg'''. Das prüft man so: | |||
*ls -l /var/log/journal | |||
*journalctl --disk-usage | |||
Umstellen auf dauerhafte Speicherung: | |||
*vim /etc/systemd/journald.conf | |||
[Journal] | |||
Storage=persistent | |||
SystemMaxUse=200M | |||
SystemMaxFileSize=20M | |||
MaxRetentionSec=1month | |||
*systemctl restart systemd-journald | |||
*ls -l /var/log/journal | |||
*journalctl --disk-usage | |||
Aufräumen von Hand: | |||
*journalctl --vacuum-time=7d | |||
*journalctl --vacuum-size=100M | |||
*journalctl --verify | |||
'''Merke:''' Das Journal rotiert sich selbst über <code>SystemMaxUse=</code>. Es braucht kein logrotate. | |||
=== Aufgabe 3 === | |||
* Prüfe auf der Debian-Maschine, ob das Journal persistent ist. | |||
* Stelle es auf dauerhafte Speicherung um und begrenze es auf 200 MB. | |||
* Starte die Maschine neu und weise nach, dass die Meldungen von vor dem Reboot noch vorhanden sind. | |||
* Wie groß ist das Journal jetzt? | |||
== rsyslog == | |||
rsyslog holt sich die Meldungen aus dem Journal und schreibt sie in Textdateien. Auf Debian muss er erst installiert werden: | |||
*apt install rsyslog | |||
Auf Rocky ist er bereits vorhanden: | |||
*rpm -q rsyslog | |||
*systemctl status rsyslog | |||
=== Facility und Severity === | |||
Jede Syslog-Meldung hat zwei Merkmale: '''woher''' sie kommt (Facility) und '''wie dringend''' sie ist (Severity). | |||
{| class="wikitable" | |||
! Facility !! Bedeutung | |||
|- | |||
| kern || Kernel | |||
|- | |||
| auth, authpriv || Anmeldung, Rechte | |||
|- | |||
| daemon || Systemdienste | |||
|- | |||
| mail || Mailsystem | |||
|- | |||
| cron || Zeitsteuerung | |||
|- | |||
| local0–local7 || frei verwendbar für eigene Zwecke | |||
|} | |||
{| class="wikitable" | |||
! Nr. !! Severity !! Bedeutung | |||
|- | |||
| 0 || emerg || System unbrauchbar | |||
|- | |||
| 1 || alert || sofortiges Eingreifen nötig | |||
|- | |||
| 2 || crit || kritischer Zustand | |||
|- | |||
| 3 || err || Fehler | |||
|- | |||
| 4 || warning || Warnung | |||
|- | |||
| 5 || notice || normal, aber bemerkenswert | |||
|- | |||
| 6 || info || Information | |||
|- | |||
| 7 || debug || Fehlersuche | |||
|} | |||
Die Regeln stehen in der Form <code>facility.severity Ziel</code>, wobei die angegebene Severity und alles '''dringendere''' zutrifft. | |||
=== Konfiguration ansehen === | |||
*less /etc/rsyslog.conf | |||
*ls -l /etc/rsyslog.d/ | |||
=== Eigene Regel schreiben === | |||
*vim /etc/rsyslog.d/99-kurs.conf | |||
local3.* /var/log/kurs.log | |||
local3.err /var/log/kurs-fehler.log | |||
*systemctl restart rsyslog | |||
Testmeldungen erzeugen: | |||
*logger -p local3.info "Das ist eine Testmeldung" | |||
*logger -p local3.err "Das ist ein Testfehler" | |||
*cat /var/log/kurs.log | |||
*cat /var/log/kurs-fehler.log | |||
=== Aufgabe 4 === | |||
* Installiere rsyslog auf der Debian-Maschine und sieh nach, welche Dateien jetzt in <code>/var/log</code> entstehen. | |||
* Lege eine Regel an, die alle Meldungen der Facility <code>local5</code> nach <code>/var/log/uebung.log</code> schreibt. | |||
* Erzeuge mit <code>logger</code> je eine Meldung der Severity info, warning und err. | |||
* Ändere die Regel so, dass nur noch Meldungen ab Severity <code>warning</code> geschrieben werden, und weise nach, dass die info-Meldung nicht mehr ankommt. | |||
* Suche dieselbe Meldung anschließend im Journal mit <code>journalctl -g</code>. Warum ist sie dort trotzdem zu finden? | |||
== logrotate == | |||
Textlogs wachsen unbegrenzt – dafür gibt es logrotate, das per Timer einmal täglich läuft. | |||
*systemctl status logrotate.timer | |||
*cat /etc/logrotate.conf | |||
*ls -l /etc/logrotate.d/ | |||
Eigene Rotation für die selbst angelegte Logdatei: | |||
*vim /etc/logrotate.d/kurs | |||
/var/log/kurs.log { | |||
daily | |||
rotate 7 | |||
compress | |||
delaycompress | |||
missingok | |||
notifempty | |||
create 0640 root adm | |||
postrotate | |||
systemctl kill -s HUP rsyslog.service | |||
endscript | |||
} | |||
Testlauf ohne Änderungen (Trockenlauf): | |||
*logrotate -d /etc/logrotate.d/kurs | |||
Rotation erzwingen: | |||
*logrotate -f /etc/logrotate.d/kurs | |||
*ls -l /var/log/kurs.log* | |||
Zustand nachsehen: | |||
*cat /var/lib/logrotate/logrotate.status | |||
'''Achtung Rocky:''' Dort lautet die Gruppe der Logdateien <code>root</code> statt <code>adm</code>, die <code>create</code>-Zeile muss angepasst werden. | |||
=== Aufgabe 5 === | |||
* Schreibe eine logrotate-Konfiguration für <code>/var/log/uebung.log</code> aus Aufgabe 4. | |||
* Es sollen 4 Generationen aufgehoben und komprimiert werden, Rotation wöchentlich oder ab 1 MB. | |||
* Prüfe die Konfiguration erst im Trockenlauf, rotiere dann von Hand. | |||
* Erzeuge danach eine neue Meldung und weise nach, dass sie in der neuen Datei landet. | |||
== Zentraler Loghost == | |||
Der eigentliche Grund, warum rsyslog auch heute noch gebraucht wird: Logs mehrerer Maschinen an einer Stelle sammeln. Im Kurs wird die '''Rocky-Maschine zum Server''' und die '''Debian-Maschine zum Client'''. | |||
=== Server einrichten (Rocky) === | |||
*vim /etc/rsyslog.d/10-server.conf | |||
module(load="imudp") | |||
input(type="imudp" port="514") | |||
module(load="imtcp") | |||
input(type="imtcp" port="514") | |||
$template FernLog,"/var/log/hosts/%HOSTNAME%/%PROGRAMNAME%.log" | |||
:fromhost-ip, !isequal, "127.0.0.1" ?FernLog | |||
& stop | |||
*mkdir /var/log/hosts | |||
*systemctl restart rsyslog | |||
*ss -tulpn | grep 514 | |||
Firewall öffnen: | |||
*firewall-cmd --add-port=514/tcp --permanent | |||
*firewall-cmd --add-port=514/udp --permanent | |||
*firewall-cmd --reload | |||
SELinux prüfen – Port 514 ist als <code>syslogd_port_t</code> bereits bekannt: | |||
*semanage port -l | grep syslog | |||
=== Client einrichten (Debian) === | |||
*vim /etc/rsyslog.d/20-client.conf | |||
*.* action(type="omfwd" | |||
target="192.168.1.10" | |||
port="514" | |||
protocol="tcp" | |||
queue.type="linkedlist" | |||
queue.filename="fwdqueue" | |||
action.resumeRetryCount="-1" | |||
queue.saveOnShutdown="on") | |||
*systemctl restart rsyslog | |||
*logger -p local3.info "Hallo vom Client" | |||
Auf dem Server nachsehen: | |||
*ls -l /var/log/hosts/ | |||
*tail -f /var/log/hosts/*/*.log | |||
=== Aufgabe 6 === | |||
* Richte die Rocky-Maschine als Loghost ein und die Debian-Maschine als Client. | |||
* Weise nach, dass der Server auf Port 514 lauscht. | |||
* Erzeuge auf dem Client eine Meldung und finde sie auf dem Server wieder. | |||
* Melde dich per SSH falsch am Client an – landet die Meldung ebenfalls auf dem Server? | |||
* Stoppe rsyslog auf dem Server, erzeuge auf dem Client Meldungen, starte den Server wieder. Sind die Meldungen nachgeliefert worden? Warum? | |||
* Trage in die logrotate-Konfiguration des Servers ein Verzeichnis mit Wildcard ein, damit auch die eingesammelten Logs rotiert werden. | |||
== Zusammenfassung == | |||
* Alles läuft zuerst durch '''journald''' – <code>journalctl</code> ist das Werkzeug erster Wahl bei der Fehlersuche | |||
* Merkhilfe für den Alltag: <code>-u</code> welche Unit, <code>-f</code> live mitlesen, <code>-g</code> suchen, <code>-k</code> Kernel | |||
* Das Journal ist nicht automatisch persistent und rotiert sich selbst | |||
* '''rsyslog''' wird gebraucht für Textdateien, klassische Auswertungswerkzeuge und vor allem für zentrale Logsammlung | |||
* '''logrotate''' verwaltet nur Textdateien, nicht das Journal | |||
* Ein zentraler Loghost ist die Vorstufe zu einem SIEM | |||
[[Kategorie:Linux]] | |||
[[Kategorie:Systemverwaltung]] | |||
=Weiteres= | |||
*[[Ubuntu Log files checken]] | *[[Ubuntu Log files checken]] | ||
*[[Systemd-journalctl-beschreibung]] | *[[Systemd-journalctl-beschreibung]] | ||
Version vom 25. August 2026, 13:45 Uhr
Log-Dateien verwalten
Auf modernen Linux-Systemen gibt es zwei Log-Welten, die nebeneinander existieren:
- systemd-journald – sammelt alles zentral in einem Binärformat, abgefragt mit
journalctl - rsyslog – der klassische Syslog-Dienst, schreibt Textdateien nach
/var/logund kann Meldungen über das Netz verschicken
Wichtiger Unterschied zwischen den Kursmaschinen:
| System | journald | rsyslog |
|---|---|---|
| Rocky Linux | aktiv | installiert und aktiv, schreibt /var/log/messages und /var/log/secure |
| Debian (ab 12) | aktiv | nicht installiert, muss bei Bedarf nachinstalliert werden |
Deshalb findet man auf der Debian-Maschine kein /var/log/syslog mehr – die Meldungen sind trotzdem da, nur im Journal.
Ausgangslage prüfen
Zuerst auf beiden Maschinen nachsehen, wer überhaupt loggt.
- systemctl status systemd-journald
- systemctl status rsyslog
- ls -l /var/log
Aufgabe 1
- Vergleiche den Inhalt von
/var/logauf Rocky und auf Debian. - Welche Dateien gibt es nur auf Rocky? Woher kommen sie?
- Prüfe auf beiden Systemen, ob der Dienst
rsyslogexistiert.
Das Journal abfragen
Das Journal wird nicht mit cat oder tail gelesen, sondern immer über journalctl.
Grundlegende Aufrufe:
- journalctl
- journalctl -n 20
- journalctl -e
- journalctl -b
- journalctl -b -1
Die vier wichtigsten Optionen im Alltag:
| Option | Bedeutung |
|---|---|
-u |
nur Meldungen einer bestimmten Unit |
-f |
mitlaufen lassen (wie tail -f)
|
-g |
Volltextsuche im Meldungstext (grep, Regex) |
-k |
nur Kernel-Meldungen (entspricht dmesg)
|
- journalctl -u sshd
- journalctl -u sshd -f
- journalctl -g "Failed password"
- journalctl -g "error" -p err
- journalctl -k
- journalctl -k -b -1
Kombinieren lässt sich das beliebig:
- journalctl -u sshd -g "Accepted" --since today
- journalctl -f -u sshd -g "Failed"
Zeitliche Eingrenzung:
- journalctl --since "2026-08-25 08:00"
- journalctl --since "1 hour ago"
- journalctl --since yesterday --until today
Nach Priorität filtern (0=emerg bis 7=debug):
- journalctl -p warning
- journalctl -p err -b
Andere Ausgabeformate:
- journalctl -u sshd -o verbose
- journalctl -u sshd -o json-pretty
- journalctl -u sshd -o short-iso
Aufgabe 2
- Melde dich von der anderen Maschine per SSH an – einmal erfolgreich, einmal mit falschem Passwort.
- Lass dir auf der Zielmaschine in einem zweiten Terminal die SSH-Meldungen live mitlaufen.
- Finde alle fehlgeschlagenen Anmeldungen des heutigen Tages mit einer einzigen Zeile.
- Zeige alle Kernel-Meldungen des letzten Bootvorgangs an.
- Suche im Journal nach dem Namen einer deiner Netzwerkkarten.
Das Journal persistent machen
Standardmäßig liegt das Journal auf Debian nur unter /run/log/journal und ist damit nach dem Reboot weg. Das prüft man so:
- ls -l /var/log/journal
- journalctl --disk-usage
Umstellen auf dauerhafte Speicherung:
- vim /etc/systemd/journald.conf
[Journal] Storage=persistent SystemMaxUse=200M SystemMaxFileSize=20M MaxRetentionSec=1month
- systemctl restart systemd-journald
- ls -l /var/log/journal
- journalctl --disk-usage
Aufräumen von Hand:
- journalctl --vacuum-time=7d
- journalctl --vacuum-size=100M
- journalctl --verify
Merke: Das Journal rotiert sich selbst über SystemMaxUse=. Es braucht kein logrotate.
Aufgabe 3
- Prüfe auf der Debian-Maschine, ob das Journal persistent ist.
- Stelle es auf dauerhafte Speicherung um und begrenze es auf 200 MB.
- Starte die Maschine neu und weise nach, dass die Meldungen von vor dem Reboot noch vorhanden sind.
- Wie groß ist das Journal jetzt?
rsyslog
rsyslog holt sich die Meldungen aus dem Journal und schreibt sie in Textdateien. Auf Debian muss er erst installiert werden:
- apt install rsyslog
Auf Rocky ist er bereits vorhanden:
- rpm -q rsyslog
- systemctl status rsyslog
Facility und Severity
Jede Syslog-Meldung hat zwei Merkmale: woher sie kommt (Facility) und wie dringend sie ist (Severity).
| Facility | Bedeutung |
|---|---|
| kern | Kernel |
| auth, authpriv | Anmeldung, Rechte |
| daemon | Systemdienste |
| Mailsystem | |
| cron | Zeitsteuerung |
| local0–local7 | frei verwendbar für eigene Zwecke |
| Nr. | Severity | Bedeutung |
|---|---|---|
| 0 | emerg | System unbrauchbar |
| 1 | alert | sofortiges Eingreifen nötig |
| 2 | crit | kritischer Zustand |
| 3 | err | Fehler |
| 4 | warning | Warnung |
| 5 | notice | normal, aber bemerkenswert |
| 6 | info | Information |
| 7 | debug | Fehlersuche |
Die Regeln stehen in der Form facility.severity Ziel, wobei die angegebene Severity und alles dringendere zutrifft.
Konfiguration ansehen
- less /etc/rsyslog.conf
- ls -l /etc/rsyslog.d/
Eigene Regel schreiben
- vim /etc/rsyslog.d/99-kurs.conf
local3.* /var/log/kurs.log local3.err /var/log/kurs-fehler.log
- systemctl restart rsyslog
Testmeldungen erzeugen:
- logger -p local3.info "Das ist eine Testmeldung"
- logger -p local3.err "Das ist ein Testfehler"
- cat /var/log/kurs.log
- cat /var/log/kurs-fehler.log
Aufgabe 4
- Installiere rsyslog auf der Debian-Maschine und sieh nach, welche Dateien jetzt in
/var/logentstehen. - Lege eine Regel an, die alle Meldungen der Facility
local5nach/var/log/uebung.logschreibt. - Erzeuge mit
loggerje eine Meldung der Severity info, warning und err. - Ändere die Regel so, dass nur noch Meldungen ab Severity
warninggeschrieben werden, und weise nach, dass die info-Meldung nicht mehr ankommt. - Suche dieselbe Meldung anschließend im Journal mit
journalctl -g. Warum ist sie dort trotzdem zu finden?
logrotate
Textlogs wachsen unbegrenzt – dafür gibt es logrotate, das per Timer einmal täglich läuft.
- systemctl status logrotate.timer
- cat /etc/logrotate.conf
- ls -l /etc/logrotate.d/
Eigene Rotation für die selbst angelegte Logdatei:
- vim /etc/logrotate.d/kurs
/var/log/kurs.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 root adm
postrotate
systemctl kill -s HUP rsyslog.service
endscript
}
Testlauf ohne Änderungen (Trockenlauf):
- logrotate -d /etc/logrotate.d/kurs
Rotation erzwingen:
- logrotate -f /etc/logrotate.d/kurs
- ls -l /var/log/kurs.log*
Zustand nachsehen:
- cat /var/lib/logrotate/logrotate.status
Achtung Rocky: Dort lautet die Gruppe der Logdateien root statt adm, die create-Zeile muss angepasst werden.
Aufgabe 5
- Schreibe eine logrotate-Konfiguration für
/var/log/uebung.logaus Aufgabe 4. - Es sollen 4 Generationen aufgehoben und komprimiert werden, Rotation wöchentlich oder ab 1 MB.
- Prüfe die Konfiguration erst im Trockenlauf, rotiere dann von Hand.
- Erzeuge danach eine neue Meldung und weise nach, dass sie in der neuen Datei landet.
Zentraler Loghost
Der eigentliche Grund, warum rsyslog auch heute noch gebraucht wird: Logs mehrerer Maschinen an einer Stelle sammeln. Im Kurs wird die Rocky-Maschine zum Server und die Debian-Maschine zum Client.
Server einrichten (Rocky)
- vim /etc/rsyslog.d/10-server.conf
module(load="imudp") input(type="imudp" port="514") module(load="imtcp") input(type="imtcp" port="514") $template FernLog,"/var/log/hosts/%HOSTNAME%/%PROGRAMNAME%.log" :fromhost-ip, !isequal, "127.0.0.1" ?FernLog & stop
- mkdir /var/log/hosts
- systemctl restart rsyslog
- ss -tulpn | grep 514
Firewall öffnen:
- firewall-cmd --add-port=514/tcp --permanent
- firewall-cmd --add-port=514/udp --permanent
- firewall-cmd --reload
SELinux prüfen – Port 514 ist als syslogd_port_t bereits bekannt:
- semanage port -l | grep syslog
Client einrichten (Debian)
- vim /etc/rsyslog.d/20-client.conf
*.* action(type="omfwd"
target="192.168.1.10"
port="514"
protocol="tcp"
queue.type="linkedlist"
queue.filename="fwdqueue"
action.resumeRetryCount="-1"
queue.saveOnShutdown="on")
- systemctl restart rsyslog
- logger -p local3.info "Hallo vom Client"
Auf dem Server nachsehen:
- ls -l /var/log/hosts/
- tail -f /var/log/hosts/*/*.log
Aufgabe 6
- Richte die Rocky-Maschine als Loghost ein und die Debian-Maschine als Client.
- Weise nach, dass der Server auf Port 514 lauscht.
- Erzeuge auf dem Client eine Meldung und finde sie auf dem Server wieder.
- Melde dich per SSH falsch am Client an – landet die Meldung ebenfalls auf dem Server?
- Stoppe rsyslog auf dem Server, erzeuge auf dem Client Meldungen, starte den Server wieder. Sind die Meldungen nachgeliefert worden? Warum?
- Trage in die logrotate-Konfiguration des Servers ein Verzeichnis mit Wildcard ein, damit auch die eingesammelten Logs rotiert werden.
Zusammenfassung
- Alles läuft zuerst durch journald –
journalctlist das Werkzeug erster Wahl bei der Fehlersuche - Merkhilfe für den Alltag:
-uwelche Unit,-flive mitlesen,-gsuchen,-kKernel - Das Journal ist nicht automatisch persistent und rotiert sich selbst
- rsyslog wird gebraucht für Textdateien, klassische Auswertungswerkzeuge und vor allem für zentrale Logsammlung
- logrotate verwaltet nur Textdateien, nicht das Journal
- Ein zentraler Loghost ist die Vorstufe zu einem SIEM