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

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

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