rsyslog ist der Standard-Syslog-Daemon für Linux. Er sammelt System-Logs, filtert sie und kann sie an zentrale Server weiterleiten.
Installation
# Meist vorinstalliert
# Debian/Ubuntu
apt install rsyslog
# RHEL/CentOS
dnf install rsyslog
# Service aktivieren
systemctl enable rsyslog
systemctl start rsyslogGrundlagen
Konfigurationsdateien
# Hauptkonfiguration
/etc/rsyslog.conf
# Zusätzliche Configs
/etc/rsyslog.d/*.conf
# Standard-Logs
/var/log/syslog # Debian
/var/log/messages # RHELBasis-Konfiguration
# /etc/rsyslog.conf
# Module laden
module(load="imuxsock") # Local Unix Socket
module(load="imklog") # Kernel-Logs
# Globale Direktiven
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$Umask 0022
# Standard-Regeln
*.info;mail.none;authpriv.none;cron.none /var/log/messages
authpriv.* /var/log/secure
mail.* /var/log/maillog
cron.* /var/log/cron
*.emerg :omusrmsg:*Facilities und Severities
Facilities
| Facility | Nummer | Beschreibung | |----------|--------|--------------| | kern | 0 | Kernel | | user | 1 | User-Programme | | mail | 2 | Mail-System | | daemon | 3 | Daemons | | auth | 4 | Authentifizierung | | syslog | 5 | Syslog selbst | | lpr | 6 | Drucker | | news | 7 | News | | cron | 9 | Cron | | local0-7 | 16-23 | Lokal definiert |
Severities
| Severity | Nummer | Beschreibung | |----------|--------|--------------| | emerg | 0 | System unbrauchbar | | alert | 1 | Sofortige Aktion nötig | | crit | 2 | Kritisch | | err | 3 | Fehler | | warning | 4 | Warnung | | notice | 5 | Normal, aber bedeutsam | | info | 6 | Informativ | | debug | 7 | Debug |
Filter-Syntax
# Alle von auth
auth.* /var/log/auth.log
# Nur error und höher
*.err /var/log/errors.log
# Nur warning
mail.=warning /var/log/mail-warnings.log
# warning und höher von mail
mail.warning /var/log/mail.log
# Ausschluss
*.info;mail.none /var/log/messages
# Mehrere Facilities
auth,authpriv.* /var/log/auth.logZentraler Log-Server
Server-Konfiguration
# /etc/rsyslog.d/server.conf
# UDP empfangen
module(load="imudp")
input(type="imudp" port="514")
# TCP empfangen
module(load="imtcp")
input(type="imtcp" port="514")
# TCP mit TLS
module(load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.Authmode="x509/name"
)
input(type="imtcp" port="6514")
# Logs nach Hostname sortieren
$template RemoteLogs,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteLogs
& stopClient-Konfiguration
# /etc/rsyslog.d/client.conf
# Alles an zentralen Server (UDP)
*.* @logserver.example.de:514
# Mit TCP (zuverlässiger)
*.* @@logserver.example.de:514
# Nur bestimmte Facility
auth.* @@logserver.example.de:514
# Mit Queue (verhindert Datenverlust)
*.* action(type="omfwd"
target="logserver.example.de"
port="514"
protocol="tcp"
queue.type="LinkedList"
queue.filename="fwdRule1"
queue.maxdiskspace="1g"
queue.saveonshutdown="on"
action.resumeRetryCount="-1"
)Templates
Standard-Templates
# Eigenes Format
$template MyFormat,"%TIMESTAMP% %HOSTNAME% %syslogtag%%msg%\n"
*.* /var/log/custom.log;MyFormat
# JSON-Format
$template JsonFormat,"{ \"timestamp\":\"%TIMESTAMP:::date-rfc3339%\", \"host\":\"%HOSTNAME%\", \"severity\":\"%syslogseverity-text%\", \"facility\":\"%syslogfacility-text%\", \"tag\":\"%syslogtag%\", \"message\":\"%msg:::json%\" }\n"
*.* /var/log/json.log;JsonFormatDynamische Dateinamen
# Nach Hostname
$template HostLog,"/var/log/hosts/%HOSTNAME%/syslog.log"
*.* ?HostLog
# Nach Datum
$template DailyLog,"/var/log/archive/%$YEAR%/%$MONTH%/%$DAY%/syslog.log"
*.* ?DailyLog
# Nach Programm
$template ProgLog,"/var/log/programs/%PROGRAMNAME%.log"
*.* ?ProgLogRainerScript (moderne Syntax)
Basis
# /etc/rsyslog.d/modern.conf
# Bedingungen
if $programname == 'nginx' then {
action(type="omfile" file="/var/log/nginx/access.log")
stop
}
# Regex
if $msg contains 'error' then {
action(type="omfile" file="/var/log/errors.log")
}
# Mehrere Bedingungen
if $syslogfacility-text == 'auth' and $syslogseverity <= 4 then {
action(type="omfile" file="/var/log/auth-errors.log")
}Properties
# Verfügbare Properties
$msg # Nachricht
$rawmsg # Rohe Nachricht
$hostname # Hostname
$syslogtag # Programm-Tag
$programname # Programmname
$syslogfacility-text # Facility als Text
$syslogseverity-text # Severity als Text
$timegenerated # ZeitstempelOutput-Module
Datei
# Standard
action(type="omfile" file="/var/log/messages")
# Mit Rotation
action(type="omfile"
file="/var/log/messages"
fileOwner="syslog"
fileGroup="adm"
fileCreateMode="0640"
)Datenbank (MySQL)
# Modul laden
module(load="ommysql")
# Action
action(type="ommysql"
server="localhost"
db="syslog"
uid="rsyslog"
pwd="secret"
)Elasticsearch
# Modul laden
module(load="omelasticsearch")
# Action
action(type="omelasticsearch"
server="elasticsearch.example.de"
serverport="9200"
template="JsonFormat"
searchIndex="syslog"
dynSearchIndex="on"
)Kafka
# Modul laden
module(load="omkafka")
# Action
action(type="omkafka"
topic="syslog"
broker="kafka.example.de:9092"
template="JsonFormat"
)TLS-Verschlüsselung
Zertifikate
# CA und Zertifikate erstellen
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/rsyslog.d/ca.key \
-out /etc/rsyslog.d/ca.crtServer mit TLS
# /etc/rsyslog.d/tls-server.conf
module(load="imtcp"
StreamDriver.Name="gtls"
StreamDriver.Mode="1"
StreamDriver.Authmode="anon"
)
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.crt"
DefaultNetstreamDriverCertFile="/etc/rsyslog.d/server.crt"
DefaultNetstreamDriverKeyFile="/etc/rsyslog.d/server.key"
)
input(type="imtcp" port="6514")Client mit TLS
# /etc/rsyslog.d/tls-client.conf
global(
DefaultNetstreamDriver="gtls"
DefaultNetstreamDriverCAFile="/etc/rsyslog.d/ca.crt"
)
action(type="omfwd"
target="logserver.example.de"
port="6514"
protocol="tcp"
StreamDriver="gtls"
StreamDriverMode="1"
StreamDriverAuthMode="anon"
)Troubleshooting
Debug-Modus
# rsyslog mit Debug starten
rsyslogd -n -d
# Konfiguration prüfen
rsyslogd -N 1Logs prüfen
# rsyslog-eigene Logs
tail -f /var/log/syslog | grep rsyslog
# Statistiken
rsyslogd -N 1 -o 1
# Impstats-Modul
module(load="impstats" interval="60")Häufige Probleme
# "rsyslogd: could not open output pipe"
# → Berechtigungen prüfen
# Logs kommen nicht an
# → Firewall prüfen: ufw allow 514/udp
# Doppelte Logs
# → & stop nach Regel hinzufügenZusammenfassung
| Syntax | Beschreibung | |--------|--------------| | facility.severity | Filter | | @host | UDP senden | | @@host | TCP senden | | ?template | Dynamischer Pfad | | & stop | Verarbeitung stoppen |
| Modul | Funktion | |-------|----------| | imuxsock | Lokale Logs | | imklog | Kernel-Logs | | imtcp | TCP-Input | | imudp | UDP-Input | | omfile | Datei-Output | | omfwd | Forwarding |
| Port | Protokoll | |------|-----------| | 514/udp | Syslog UDP | | 514/tcp | Syslog TCP | | 6514/tcp | Syslog TLS |
| Datei | Beschreibung | |-------|--------------| | /etc/rsyslog.conf | Hauptkonfiguration | | /etc/rsyslog.d/ | Zusätzliche Configs | | /var/log/syslog | Standard-Log (Debian) | | /var/log/messages | Standard-Log (RHEL) |
Fazit
rsyslog ist flexibel für Log-Management. Zentrale Log-Server vereinfachen Analyse. TLS sollte für Remote-Logging verwendet werden. RainerScript bietet moderne Konfiguration. Für große Umgebungen sind ELK oder Graylog besser skalierbar.