Feedback

Eventlog – Eintrag schreiben

Sprache: C#

Diese Funktion fügt dem Eventlog (auch Fehlerprotokoll genannt) einen Eintrag hinzu
/// <summary>
/// schreibt einen Eintrag ins Eventlog von Windows NT/2000/XP
/// </summary>
/// <param name="source">Quelle</param>
/// <param name="message">Nachricht</param>
/// <param name="type">Typ</param>
private  void WriteEventlogMessage(string source, string message, System.Diagnostics.EventLogEntryType type)
{
    System.Diagnostics.EventLog myEV = new System.Diagnostics.EventLog();
    myEV.Source = source;
    myEV.WriteEntry(message, type);
    myEV.Close();
}
/// <summary>
/// schreibt einen Eintrag ins Eventlog von Windows NT/2000/XP
/// </summary>
/// <param name="source">Quelle</param>
/// <param name="message">Nachricht</param>
/// <param name="type">Typ</param>
private  void WriteEventlogMessage(string source, string message, System.Diagnostics.EventLogEntryType type)
{
    System.Diagnostics.EventLog myEV = new System.Diagnostics.EventLog();
    myEV.Source = source;
    myEV.WriteEntry(message, type);
    myEV.Close();
}

1 Kommentar

  1. Der Code ist ein typisches Beispiel aus der .NET-2.0/3.5-Ära: schnell einen EventLog-Eintrag schreiben, am besten gleich noch die Source anlegen. In modernen Windows-Setups und erst recht in Cloud-/Container-Szenarien ist das aber deutlich heikler, weil das Anlegen einer Source Adminrechte braucht, weil EventLog Windows-only ist und weil man Logging heute normalerweise über ILogger/ETW/EventSource abstrahiert.

    [b]Analyse nach heutigen Kriterien:[/b]
    – [u]Cross-Platform[/u]: System.Diagnostics.EventLog ist Windows-only. Auf Linux/macOS gibt es kein Windows Event Log. Ohne Plattform-Gating führt das zu Laufzeitproblemen.
    – [u]Cloud/Container[/u]: In Containern und in vielen Cloud-Deployments ist das Windows Event Log nicht das primäre Logging-Ziel. Üblich sind STDOUT/STDERR, zentrale Log-Aggregation und strukturierte Logs.
    – [u]Sicherheit/Rechte[/u]: EventLog.CreateEventSource erfordert typischerweise administrative Rechte und schreibt in die Registry. Das zur Laufzeit in einer App zu tun ist ein Anti-Pattern und kann in gehärteten Umgebungen scheitern.
    – [u]Robustheit[/u]: „Existiert Source? dann anlegen“ ist race-condition-anfällig, wenn mehrere Prozesse parallel starten. Außerdem fehlt sauberes Fehlerhandling und eine klare Trennung zwischen Setup (Install) und Laufzeit (Log schreiben).
    – [u]Performance[/u]: EventLog ist relativ teuer, insbesondere wenn die Source erst erzeugt oder geprüft wird. Auch das permanente Prüfen auf Source-Existenz kostet.
    – [u]Thread-Safety[/u]: Schreiben ist grundsätzlich thread-safe genug für typische Nutzung, aber die Source-Erstellung ist globaler Zustand und parallel problematisch.
    – [u]Standard-.NET-Ansatz heute[/u]: In modernen Apps ist ILogger (Microsoft.Extensions.Logging) der Standard. Für Windows Event Log gibt es Provider, und unter Windows kann man zusätzlich ETW/EventSource nutzen.

    [b]Modernisierte Variante (ILogger-first, optional Windows Event Log via Provider, keine Source-Erstellung zur Laufzeit):[/b]
    [code]
    using System;
    using Microsoft.Extensions.Logging;

    public static class AppLogging
    {
    public static void LogStartup(ILogger logger)
    {
    if (logger is null) throw new ArgumentNullException(nameof(logger));
    logger.LogInformation(„Application started.“);
    }

    public static void LogError(ILogger logger, Exception ex)
    {
    if (logger is null) throw new ArgumentNullException(nameof(logger));
    if (ex is null) throw new ArgumentNullException(nameof(ex));
    logger.LogError(ex, „Unhandled exception.“);
    }
    }
    [/code]

    [b]Hinweis zur EventLog-Anbindung:[/b]
    Wenn du wirklich ins Windows Event Log schreiben willst, dann nicht per CreateEventSource zur Laufzeit, sondern als Install-/Deployment-Schritt (z. B. MSI/Script/Installer) und dann über den passenden Logging-Provider. In vielen Fällen reicht es, strukturierte Logs über ILogger auszugeben und die Plattform entscheidet, wohin sie gehen.

    [b]Warum das heute objektiv besser ist:[/b]
    – [u]Plattformtauglichkeit[/u]: Der Code bleibt auf allen Plattformen lauffähig; die Entscheidung „EventLog ja/nein“ liegt im Hosting/Deployment.
    – [u]Robustheit[/u]: Kein globaler Seiteneffekt (Source-Erstellung) beim App-Start, keine Race-Conditions zwischen Prozessen.
    – [u]Cloud-Fähigkeit[/u]: Funktioniert mit modernen Logging-Pipelines (Container logs, OpenTelemetry, zentrale Aggregation).
    – [u]Wartbarkeit[/u]: Logging ist standardisiert und austauschbar, statt hart an Windows Event Log gebunden zu sein.

    [b]Security-Realitätscheck:[/b]
    Wenn eine App versucht, zur Laufzeit eine EventLog-Source anzulegen, ist das in vielen Umgebungen ein rotes Tuch (Adminrechte, Registry-Schreibzugriff). Source-Anlage gehört in den Installationsprozess, nicht in den normalen Programmablauf.