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 rsyslog

Grundlagen

Konfigurationsdateien

# Hauptkonfiguration
/etc/rsyslog.conf

# Zusätzliche Configs
/etc/rsyslog.d/*.conf

# Standard-Logs
/var/log/syslog      # Debian
/var/log/messages    # RHEL

Basis-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

FacilityNummerBeschreibung
kern0Kernel
user1User-Programme
mail2Mail-System
daemon3Daemons
auth4Authentifizierung
syslog5Syslog selbst
lpr6Drucker
news7News
cron9Cron
local0-716-23Lokal definiert

Severities

SeverityNummerBeschreibung
emerg0System unbrauchbar
alert1Sofortige Aktion nötig
crit2Kritisch
err3Fehler
warning4Warnung
notice5Normal, aber bedeutsam
info6Informativ
debug7Debug

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.log

Zentraler 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
& stop

Client-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;JsonFormat

Dynamische 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"
*.* ?ProgLog

RainerScript (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 # Zeitstempel

Output-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.crt

Server 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 1

Logs 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ügen

Zusammenfassung

SyntaxBeschreibung
facility.severityFilter
@hostUDP senden
@@hostTCP senden
?templateDynamischer Pfad
& stopVerarbeitung stoppen
ModulFunktion
imuxsockLokale Logs
imklogKernel-Logs
imtcpTCP-Input
imudpUDP-Input
omfileDatei-Output
omfwdForwarding
PortProtokoll
514/udpSyslog UDP
514/tcpSyslog TCP
6514/tcpSyslog TLS
DateiBeschreibung
/etc/rsyslog.confHauptkonfiguration
/etc/rsyslog.d/Zusätzliche Configs
/var/log/syslogStandard-Log (Debian)
/var/log/messagesStandard-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.