C# Logging & Monitoring: Vom Chaos zur Ordnung | PythonLib

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Warum deine C#-App schreit, du sie aber nicht hörst?

\n

Stell dir vor: Du deployest um Mitternacht eine neue Version deines C#-Microservices. Alles läuft perfekt... die ersten 10 Minuten. Und dann – Bumm! – Nutzer beschweren sich über lahme Performance, und du sitzt vor einer 2 GB großen Log-Datei und suchst die Nadel im Heuhaufen. Kommt dir bekannt vor? Falls nicht, bist du entweder ein Genie oder hast dich noch nie ernsthaft mit Monitoring beschäftigt.

\n

In diesem Artikel zeigen wir dir, wie du aus dem Log-Chaos ein strukturiertes System machst. Du erfährst, wie du C# Logging so konfigurierst, dass du beim Deployment nicht durchdrehst, und wie du Monitoring für Anwendungen aufbaust, das wirklich hilft – und nicht nur hübsche Grafiken zeichnet.

\n\n

Der erste Schritt: Die Philosophie des richtigen Loggings

\n

Viele Entwickler denken: „Ich setze einfach Console.WriteLine – das reicht.“ Spoiler: Nein, tut es nicht. Echtes Logging in C# bedeutet strukturiertes Logging. Statt Zeilen wie:

\n
Log.Info("User " + userId + " hat Artikel " + itemId + " gekauft");
\n

schreibst du:

\n
Log.Information("Benutzer {UserId} hat Artikel {ItemId} gekauft", userId, itemId);
\n

Der Unterschied ist enorm. Im zweiten Fall kannst du Logs nach UserId filtern, Dashboards erstellen und Probleme schnell finden. Das ist die Grundlage für eine effektive Fehlerdiagnose in C# in der Produktion.

\n\n

Die richtige Bibliothek wählen: Serilog vs NLog vs log4net

\n

Im .NET-Ökosystem gibt es drei Hauptakteure. Vergleichen wir sie anhand von Kriterien, die in echten Projekten zählen:

\n
    \n
  • Serilog – der Favorit im modernen .NET. Ideal für strukturiertes Logging, einfach konfigurierbar, unterstützt zahlreiche Sinks (Datei, Datenbank, Elasticsearch). Meine Empfehlung für neue Projekte.
  • \n
  • NLog – der Veteran mit flexibler Konfiguration per XML/JSON. Perfekt für Legacy-Systeme, in denen es bereits im Einsatz ist.
  • \n
  • log4net – der Oldie, den du besser nicht ohne Not anfassen solltest. Der Support lahmt, strukturiertes Logging ist nur mit Krücken möglich.
  • \n
\n

Für die .NET-Tracediagnose in modernen Anwendungen ist Serilog die Nummer 1. Lass es uns in 5 Minuten einrichten.

\n\n

Serilog in C# einrichten: Schritt-für-Schritt-Anleitung

\n

Installiere die Pakete über NuGet:

\n
dotnet add package Serilog\ndotnet add package Serilog.Sinks.Console\ndotnet add package Serilog.Sinks.File\ndotnet add package Serilog.Sinks.Seq
\n

Jetzt die minimale Konfiguration in Program.cs für ASP.NET Core:

\n
using Serilog;\n\nLog.Logger = new LoggerConfiguration()\n    .MinimumLevel.Information()\n    .WriteTo.Console()\n    .WriteTo.File("logs/app-.log", rollingInterval: RollingInterval.Day)\n    .WriteTo.Seq("http://localhost:5341") // für fortgeschrittenes Monitoring\n    .CreateLogger();\n\ntry\n{\n    Log.Information("Webanwendung wird gestartet");\n    var builder = WebApplication.CreateBuilder(args);\n    builder.Host.UseSerilog(); // Integration mit dem Host\n    // ... weitere Konfiguration\n    var app = builder.Build();\n    app.Run();\n}\ncatch (Exception ex)\n{\n    Log.Fatal(ex, "Anwendung unerwartet beendet");\n}\nfinally\n{\n    Log.CloseAndFlush();\n}
\n

Beachte rollingInterval – die Logs werden täglich rotiert und wachsen nicht ins Unendliche. Das ist die Basis für asynchrones Logging in der Produktion.

\n\n

Strukturierte Logs: So holst du das Maximum raus

\n

Angenommen, wir haben eine Methode zur Auftragsverarbeitung. Ohne Strukturierung würdest du schreiben:

\n
logger.LogInformation("Verarbeite Auftrag {OrderId} für Benutzer {UserId}", order.Id, user.Id);
\n

Mit Serilog wird daraus ein JSON-Objekt, das sich parsen lässt. Und mit Kontext durch ILogger<T> wird es noch besser:

\n
public class OrderService\n{\n    private readonly ILogger<OrderService> _logger;\n\n    public OrderService(ILogger<OrderService> logger)\n    {\n        _logger = logger;\n    }\n\n    public async Task ProcessOrderAsync(Order order, User user)\n    {\n        using var _ = _logger.BeginScope(new { OrderId = order.Id, UserId = user.Id });\n        _logger.LogInformation("Starte Auftragsverarbeitung");\n        // ... Verarbeitungslogik\n        _logger.LogInformation("Auftrag erfolgreich verarbeitet");\n    }\n}
\n

So hast du alle relevanten Daten automatisch in jedem Log-Eintrag – perfekt für die Fehlersuche in C#-Anwendungen.

Blogs

Buchempfehlungen