« 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");
}