Start · Sprachen · PHP · Referenz · syslog

syslog

Funktion

Sendet eine Lognachricht an den System-Logger des Betriebssystems (Syslog/Event-Log).

seit PHP 4.0.0 Kategorie: http

Signatur

syslog(int $priority, string $message): bool

Beschreibung

syslog() schreibt eine Nachricht in das systemweite Protokoll des Betriebssystems – unter Linux/Unix über den syslogd-Dienst (typischerweise nach /var/log/syslog oder /var/log/messages), unter Windows in das Windows-Event-Log. Damit lassen sich Anwendungsereignisse, Fehler und Warnungen zentral und betriebssystemweit protokollieren, ohne eigene Logdateien verwalten zu müssen.

Vor dem ersten Aufruf von syslog() sollte openlog() aufgerufen werden, um einen Programmnamen (Ident), Flags und die Facility festzulegen. Am Ende der Skriptausführung kann closelog() aufgerufen werden, um die Verbindung zum System-Logger zu schließen.

Der Parameter $priority kombiniert eine Facility (z. B. LOG_USER) mit einem Severity-Level (z. B. LOG_ERR) per bitweisem ODER. Wird nur ein Severity-Level ohne Facility angegeben, greift die in openlog() eingestellte Standard-Facility.

syslog() eignet sich besonders für serverseitige Anwendungen, Daemons oder kritische Applikationen, bei denen Lognachrichten in zentrale Log-Management-Systeme (z. B. rsyslog, journald, Splunk) weitergeleitet werden sollen.

Parameter

Name Typ Default Beschreibung
$priority Pflicht int Kombination aus Facility- und Severity-Konstante, z. B. LOG_USER | LOG_ERR. Mögliche Severity-Level: LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG. Mögliche Facilities: LOG_KERN, LOG_USER, LOG_MAIL, LOG_DAEMON, LOG_AUTH, LOG_LOCAL0LOG_LOCAL7 u. a.
$message Pflicht string Der zu protokollierende Text. Unter älteren Unix-Systemen wird ein einzelnes %-Zeichen als Format-Platzhalter interpretiert – sicherheitshalber sollte % daher als %% maskiert werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg und false bei einem Fehler zurück.

Beispiele

Einfache Fehlermeldung ins Syslog schreiben

<?php
// Verbindung zum System-Logger öffnen
openlog('meine-php-app', LOG_PID | LOG_PERROR, LOG_USER);

// Informationsnachricht
syslog(LOG_INFO, 'Anwendung gestartet');

// Fehlermeldung bei einem Datenbankfehler
$fehler = 'Verbindung zur Datenbank fehlgeschlagen';
syslog(LOG_ERR, 'DB-Fehler: ' . $fehler);

// Verbindung schließen
closelog();
?>

Sicherheitsrelevante Ereignisse protokollieren

<?php
openlog('webapp-security', LOG_PID, LOG_AUTH);

$username = 'admin';
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unbekannt';

// Fehlgeschlagenen Login-Versuch protokollieren
// Wichtig: Benutzereingaben NICHT direkt einbetten, um Log-Injection zu vermeiden
$safeUser = preg_replace('/[^a-zA-Z0-9_\-@.]/', '_', $username);
$safeIp   = filter_var($ip, FILTER_VALIDATE_IP) ? $ip : 'ungueltig';

syslog(LOG_WARNING, sprintf(
    'Fehlgeschlagener Login-Versuch fuer Benutzer "%s" von IP %s',
    $safeUser,
    $safeIp
));

closelog();
?>

// Wichtig · Fallstricke

Sicherheitshinweis – Log-Injection: Werden Benutzereingaben unbereinigt in die Lognachricht übernommen, können Angreifer über Steuerzeichen oder Zeilenumbrüche (\n, \r) gefälschte Logeinträge einschleusen. Eingaben sollten daher stets bereinigt werden (z. B. mit preg_replace() oder addslashes()).

Prozent-Zeichen: Auf einigen älteren Unix-Systemen interpretiert syslogd % als Format-Sequenz. Ein einzelnes % in der Nachricht sollte daher als %% maskiert werden, um undefiniertes Verhalten zu verhindern.

Windows: Unter Windows schreibt syslog() in das Windows-Event-Log. Einige Facility-Konstanten wie LOG_LOCAL0LOG_LOCAL7 sind dort nicht verfügbar oder werden ignoriert.

Performance: Bei sehr hohem Logaufkommen kann der Syslog-Aufruf durch den IPC-Overhead leicht zur Engstelle werden. In solchen Fällen empfiehlt sich asynchrones Logging über dedizierte Logging-Bibliotheken (z. B. Monolog).