Holger Stehle

Softwareentwicklung und -architektur

« Syslog-Nachrichten versenden

Syslog beschreibt einen Protokollierungsstandard. Dieser Beitrag soll die beispielhafte Implementierung eines C#-Clients aufzeigen. Dazu werden UDP-basierte Nachrichten im (älteren) BSD-Format nach RFC 3164 erzeugt.

Sehr viele NAS können übrigens als Empfänger entsprechender Nachrichten dienen; im Folgenden die entsprechende Klasse:

public class Syslog : IDisposable {
    private const int Facility = 1;  // user-level messages
    private const int FacilityFactor = 8;

    private readonly UdpClient udpClient;


    public Syslog(string hostname = "localhost", int port = 514) {
        this.udpClient = new UdpClient(hostname, port);
    }

    public void Send(Severity severity, string message, [CallerMemberName] string caller = null) {
        byte[] data = Encoding.UTF8.GetBytes(String.Format("<{0}>{1} {2} {3}",
            ((Syslog.Facility * Syslog.FacilityFactor) + (int) severity),
            DateTime.Now.ToString("MMM dd HH:mm:ss"),
            Dns.GetHostName(),
            ((!String.IsNullOrWhiteSpace(caller)) ? (caller + " ") : (String.Empty)) + message
        ));

        this.udpClient.Send(data, data.Length);
    }

    public void Dispose() => this.udpClient?.Dispose();


    public enum Severity {
        Emergency,     // [0] system is unusable
        Alert,         // [1] action must be taken immediately
        Critical,      // [2] critical conditions
        Error,         // [3] error conditions
        Warning,       // [4] warning conditions
        Notice,        // [5] normal but significant condition
        Informational, // [6] informational messages
        Debug,         // [7] debug-level messages
    }  // https://tools.ietf.org/html/rfc3164
}

Es handelt sich hierbei – wie üblich – um eine minimale Implementierung ohne Fehlerbehandlung, welche außerdem keine Konfiguration des Facility-Wertes ermöglicht. Die Verwendung gestaltet sich nun jedoch sehr einfach:

using(Syslog syslog = new Syslog("syslog.example.net")) {
    syslog.Send(Severity.Notice, "Dies ist eine weniger interessante Meldung.");
    syslog.Send(Severity.Warning, "Dies ist eine sehr interessante Meldung.", "MyApp");
}