Syslog-Nachrichten mit C# 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.

In einem früheren Beitrag hatte ich bereits mein NAS von Synology erwähnt. Sofern ihr ebenfalls ein solches besitzt, könnt ihr dieses sehr einfach als Server einrichten und somit direkt für die Beispiele (und mehr) nutzen.
Syslog-Klasse implementieren
010203040506070809101112131415161718192021222324252627282930313233343536
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:
Syslog-Klasse verwenden
01020304
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");}

Neujahr 👍 👎

Ich bedanke mich für das bisherige Interesse und wünsche ein glückliches und erfolgreiches neues Jahr 2018.

Ich würde mich natürlich sehr darüber freuen, dich auch im nächsten Jahr wieder hier begrüßen zu dürfen.

Temporäre Datei mit C# erstellen und implizit löschen 👍 👎

Hin und wieder kann es – beispielsweise bei der Arbeit mit Datenströmen – sinnvoll bzw. notwendig sein, mit Dateien zu arbeiten, die nur vorübergehend benötigt werden. Das .NET-Framework unterstützt dies mit der Methode Path.GetTempFileName(), ohne jedoch die Datei implizit wieder zu entfernen. Um diesen kleinen Makel zu beheben, bietet sich eine kompakte Implementierung wie die folgende Lösung an, welche auf using basiert:
Klasse implementieren
010203040506070809101112
public class TemporaryFile : IDisposable {    public string Name {        get;        private set;    }
public TemporaryFile() { this.Name = Path.GetTempFileName(); }
public void Dispose() => File.Delete(this.Name);}
Die Verwendung gestaltet sich nun sehr komfortabel, wobei die Datei innerhalb der entsprechenden Anweisung existiert und wie üblich verwendet werden kann; anschließend wird diese automatisch wieder gelöscht:
Klasse verwenden
01020304050607080910111213
/* Datei existiert noch nicht */
using(TemporaryFile temporaryFile = new TemporaryFile()) { /* Datei existiert ab sofort */
File.WriteAllBytes(temporaryFile.Name, new byte[] { 0x01, 0x03, 0x03, 0x07 });
/* Datei existiert weiterhin */}
/* Datei existiert nicht mehr */

CCC-Fahrplan aktualisiert 👍 👎

Mein im letzten Jahr gestarteter CCC-Fahrplan wurde aktualisiert und enthält nun Informationen zum 34c3.

Die Daten werden regelmäßig aktualisiert; für verbindliche Angaben halte dich bitte an den offiziellen Fahrplan.

Quartal mit C# ermitteln 👍 👎

Leider bietet die DateTime-Struktur standardmäßig keine eingebaute Funktionalität zur Ermittlung des Quartals einer Instanz. Wir werden diese daher als praktische Erweiterungsmethode ergänzen:
Erweiterungsmethode implementieren
0102030405
public static class DateTimeExtensions {    public static int GetQuarter(this DateTime dateTime) {        return ((dateTime.Month + 2) / 3);    }}
Durch die vorherige Addition von 2 wird die (ganzzahlige) Teilbarkeit bei richtigem Ergebnis sichergestellt. Indem die Teilung variabel gestaltet wird, beispielsweise mit Hilfe eines zu übergebenden Aufzählungswertes mit passenden ganzzahligen Werten, können auch andere Jahresteile (z. B. Halbjahre) sehr einfach ermittelt werden:
Erweiterungsmethode implementieren (erweitert)
010203040506070809101112
public static class DateTimeExtensions {    public static int GetYearDivisionPart(this DateTime dateTime, YearDivision yearDivision) {        int monthsPerDivision = (int) yearDivision;
return ((dateTime.Month + (monthsPerDivision – 1)) / monthsPerDivision); }
public enum YearDivision { Half = 6, Quarter = (Half / 2) }}
Die Verwendung gestaltet sich in beiden Fällen naheliegend einfach:
Erweiterungsmethode verwenden
0102030405
DateTime birthday = new DateTime(1988, 1, 29);
int quarter = birthday.GetQuarter(); // 1 /* bzw. */quarter = birthday.GetYearDivisionPart(YearDivision.Quarter); // 1

Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche