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