Syslog-ng und Logrotate

Das nachfolgende Script erstellt automatisch ein Logrotate aus den Logs /var/log/datei1.log, /var/log/datei2.log und /var/log/datei3.log. Die einzelnen Logdateien müssen in Zeile 10 des Scripts einmalig angegeben werden. Alle Logdateien werden gleich behandelt und rotieren täglich für 7 Tage und werden dabei komprimiert. Der Job wird täglich um 02:00 Uhr ausgeführt.

#!/bin/bash
# ========================================
# Script: setup-syslog-ng-logrotate-safe.sh
# Zweck: Sichere Logrotate-Konfiguration für syslog-ng
# ========================================

# -----------------------------
# Variablen: Logdateien
# -----------------------------
LOG_FILES="/var/log/datei1.log /var/log/datei2.log /var/log/datei3.log"

# -----------------------------
# Logrotate-Konfigurationsdatei
# -----------------------------
LOGROTATE_CONF="/etc/logrotate.d/syslog-ng-custom"

echo "Prüfe, ob syslog-ng läuft..."

if pgrep syslog-ng >/dev/null 2>&1; then
    echo "syslog-ng läuft, copytruncate wird verwendet."
    COPYTRUNCATE="copytruncate"
else
    echo "syslog-ng läuft nicht, copytruncate wird nicht benötigt."
    COPYTRUNCATE=""
fi

echo "Erstelle Logrotate-Konfiguration unter $LOGROTATE_CONF ..."

sudo tee "$LOGROTATE_CONF" > /dev/null <<EOF
$LOG_FILES {
    daily
    rotate 7
    compress
    missingok
    notifempty
    $COPYTRUNCATE
}
EOF

echo "Logrotate-Konfiguration erstellt."

# -----------------------------
# Cronjob einrichten
# -----------------------------
CRON_JOB="0 2 * * * /usr/sbin/logrotate $LOGROTATE_CONF"

# Prüfen, ob Cronjob schon existiert
(crontab -l 2>/dev/null | grep -F "$LOGROTATE_CONF") && EXISTING=true || EXISTING=false

if [ "$EXISTING" = false ]; then
    echo "Füge Cronjob hinzu..."
    (crontab -l 2>/dev/null; echo "$CRON_JOB") | crontab -
    echo "Cronjob hinzugefügt: $CRON_JOB"
else
    echo "Cronjob existiert bereits. Keine Änderungen vorgenommen."
fi

echo "Setup abgeschlossen."

Für Faule ist das nächste Script vielleicht interessanter. Habt ihr einen zentralen Syslog-Server, kommen unter Umständen neue Geräte dazu, die Syslogdaten versenden. Werden diese vergessen, so hat man auf absehbare Zeit ein Platz Problem. Hier nimmt euch das Script diese Arbeit ab und bindet rekursiv alle Logdateien unterhalb des Verzeichnisses /var/log/ in das Logrotate ein. Ihr könnt außerdem festlegen, wie groß die Logdateien sein müssen, um berücksichtigt zu werden.

#!/bin/bash
# ====================================================================
# Script: setup-syslog-ng-logrotate-recursive-size.sh
# Zweck:
#   - Alle Logdateien in einem Ordner + Unterordner finden (rekursiv)
#   - Nur Dateien ab einer Mindestgröße in Logrotate einbeziehen
#   - Automatische Auswahl der Logdateien ohne manuelles Eintragen
#   - Sicheres Logrotate für syslog-ng (mit copytruncate)
# ====================================================================

# ----------------------------------------------------------
# CONFIG – bitte hier anpassen
# ----------------------------------------------------------

# Verzeichnis, in dem gesucht wird (rekursiv!)
LOG_DIR="/var/log"

# Muster für Dateiendungen, z. B. "*.log", "*.txt", "*" für alle
FILE_PATTERN="*.log"

# Mindestgröße für Berücksichtigung
# Beispiele:
#   +0k  → alle Dateien
#   +100k → nur >100 KB
#   +1M   → nur >1 MB
MIN_SIZE="+0k"

# Logrotate-Zieldatei
LOGROTATE_CONF="/etc/logrotate.d/syslog-ng-custom"


# ----------------------------------------------------------
# Prüfen, ob Verzeichnis existiert
# ----------------------------------------------------------
if [ ! -d "$LOG_DIR" ]; then
    echo "FEHLER: Das Verzeichnis $LOG_DIR existiert nicht."
    exit 1
fi


# ----------------------------------------------------------
# Logdateien rekursiv finden + Größenfilter anwenden
# ----------------------------------------------------------
echo "Suche Logdateien rekursiv unter: $LOG_DIR"
echo "Filter: Pattern=$FILE_PATTERN, Mindestgröße=$MIN_SIZE"
echo

LOG_FILES=$(find "$LOG_DIR" -type f -name "$FILE_PATTERN" -size "$MIN_SIZE" | tr '\n' ' ')

if [ -z "$LOG_FILES" ]; then
    echo "WARNUNG: Keine Logdateien gefunden, die den Kriterien entsprechen."
    exit 0
fi

echo "Gefundene Logdateien:"
echo "$LOG_FILES"
echo


# ----------------------------------------------------------
# Prüfen, ob syslog-ng läuft
# ----------------------------------------------------------
echo "Prüfe syslog-ng Status..."

if pgrep syslog-ng >/dev/null 2>&1; then
    echo "syslog-ng läuft → copytruncate wird aktiviert."
    COPYTRUNCATE="copytruncate"
else
    echo "syslog-ng läuft nicht → copytruncate wird deaktiviert."
    COPYTRUNCATE=""
fi


# ----------------------------------------------------------
# Logrotate-Konfiguration erstellen
# ----------------------------------------------------------
echo
echo "Erstelle Logrotate-Konfiguration unter:"
echo "  $LOGROTATE_CONF"
echo

sudo tee "$LOGROTATE_CONF" >/dev/null <<EOF
$LOG_FILES {
    daily
    rotate 7
    compress
    missingok
    notifempty
    $COPYTRUNCATE
}
EOF

echo "Logrotate-Konfiguration erstellt."
echo


# ----------------------------------------------------------
# Cronjob einrichten
# ----------------------------------------------------------
CRON_JOB="0 2 * * * /usr/sbin/logrotate $LOGROTATE_CONF"

crontab -l 2>/dev/null | grep -F "$LOGROTATE_CONF" >/dev/null
if [ $? -eq 0 ]; then
    echo "Cronjob existiert bereits. Keine Änderungen."
else
    echo "Füge Cronjob hinzu..."
    (crontab -l 2>/dev/null; echo "$CRON_JOB") | crontab -
    echo "Cronjob hinzugefügt."
fi

echo
echo "Setup abgeschlossen!"
echo "Logrotate überwacht jetzt rekursiv alle Dateien in $LOG_DIR (Pattern: $FILE_PATTERN, Mindestgröße: $MIN_SIZE)"

Zum Schluss erstellt ihr noch den passenden Cronjob dazu:

0 2 * * * /usr/sbin/logrotate /etc/logrotate.d/syslog-ng-custom