Warum deine C#-App schreit, du sie aber nicht hörst?
\nStell 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.
\nIn 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\nDer erste Schritt: Die Philosophie des richtigen Loggings
\nViele Entwickler denken: „Ich setze einfach Console.WriteLine – das reicht.“ Spoiler: Nein, tut es nicht. Echtes Logging in C# bedeutet strukturiertes Logging. Statt Zeilen wie:
\nLog.Info("User " + userId + " hat Artikel " + itemId + " gekauft");\nschreibst du:
\nLog.Information("Benutzer {UserId} hat Artikel {ItemId} gekauft", userId, itemId);\nDer 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.
Die richtige Bibliothek wählen: Serilog vs NLog vs log4net
\nIm .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
Für die .NET-Tracediagnose in modernen Anwendungen ist Serilog die Nummer 1. Lass es uns in 5 Minuten einrichten.
\n\nSerilog in C# einrichten: Schritt-für-Schritt-Anleitung
\nInstalliere die Pakete über NuGet:
\ndotnet add package Serilog\ndotnet add package Serilog.Sinks.Console\ndotnet add package Serilog.Sinks.File\ndotnet add package Serilog.Sinks.Seq\nJetzt die minimale Konfiguration in Program.cs für ASP.NET Core:
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}\nBeachte rollingInterval – die Logs werden täglich rotiert und wachsen nicht ins Unendliche. Das ist die Basis für asynchrones Logging in der Produktion.
Strukturierte Logs: So holst du das Maximum raus
\nAngenommen, wir haben eine Methode zur Auftragsverarbeitung. Ohne Strukturierung würdest du schreiben:
\nlogger.LogInformation("Verarbeite Auftrag {OrderId} für Benutzer {UserId}", order.Id, user.Id);\nMit Serilog wird daraus ein JSON-Objekt, das sich parsen lässt. Und mit Kontext durch ILogger<T> wird es noch besser:
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}\nSo hast du alle relevanten Daten automatisch in jedem Log-Eintrag – perfekt für die Fehlersuche in C#-Anwendungen.