Webframeworkk/ASP.NET Core/Protokollierung und Serilog: Unterschied zwischen den Versionen
imported>Import Version 202 |
Die Seite wurde neu angelegt: „Logging ist ein unverzichtbares Werkzeug zur Überwachung, Fehlerbehebung und Gewinnung von Einblicken in das Verhalten deiner ASP.NET Core-Anwendung. Es dient als Fenster zu den Laufzeitereignissen deiner Anwendung und ermöglicht es dir, alles von Routineoperationen bis hin zu kritischen Fehlern zu verfolgen. ---- == 1. Das <code>ILogger</code>-Interface == Das Herzstück der Logging-Infrastruktur von ASP.NET Core ist das <code>ILogger</code>-Interfa…“ |
||
| Zeile 4: | Zeile 4: | ||
Logging ist ein unverzichtbares Werkzeug zur Überwachung, Fehlerbehebung und Gewinnung von Einblicken in das Verhalten deiner ASP.NET Core-Anwendung. Es dient als Fenster zu den Laufzeitereignissen deiner Anwendung und ermöglicht es dir, alles von Routineoperationen bis hin zu kritischen Fehlern zu verfolgen. | Logging ist ein unverzichtbares Werkzeug zur Überwachung, Fehlerbehebung und Gewinnung von Einblicken in das Verhalten deiner ASP.NET Core-Anwendung. Es dient als Fenster zu den Laufzeitereignissen deiner Anwendung und ermöglicht es dir, alles von Routineoperationen bis hin zu kritischen Fehlern zu verfolgen. | ||
---- | |||
== 1. Das <code>ILogger</code>-Interface == | == 1. Das <code>ILogger</code>-Interface == | ||
| Zeile 12: | Zeile 11: | ||
'''Kernaspekte:''' | '''Kernaspekte:''' | ||
* '''Abstraktion:''' <code>ILogger</code> ist ein Interface. Das bedeutet, du kannst verschiedene Logging-Provider (Konsole, Datei, Datenbank, Cloud) einbinden, ohne deinen Anwendungscode ändern zu müssen. | * '''Abstraktion:''' <code>ILogger</code> ist ein Interface. Das bedeutet, du kannst verschiedene Logging-Provider (Konsole, Datei, Datenbank, Cloud) einbinden, ohne deinen Anwendungscode ändern zu müssen. | ||
* '''Anpassungsfähigkeit:''' Du kannst Provider wechseln oder Konfigurationen nahtlos ändern, um sie an unterschiedliche Umgebungen anzupassen. | * '''Anpassungsfähigkeit:''' Du kannst Provider wechseln oder Konfigurationen nahtlos ändern, um sie an unterschiedliche Umgebungen anzupassen. | ||
'''Log-Level (Schweregrade):''' Die Log-Level geben an, wie kritisch ein Ereignis ist: | '''Log-Level (Schweregrade):''' | ||
Die Log-Level geben an, wie kritisch ein Ereignis ist: | |||
# '''Trace:''' Sehr detailliert, meist nur für die Fehlersuche in der Entwicklung. | # '''Trace:''' Sehr detailliert, meist nur für die Fehlersuche in der Entwicklung. | ||
# '''Debug:''' Informationen für das Debugging, weniger ausführlich als Trace. | # '''Debug:''' Informationen für das Debugging, weniger ausführlich als Trace. | ||
| Zeile 25: | Zeile 23: | ||
# '''Critical:''' Kritische Systemfehler, die sofortiges Handeln erfordern. | # '''Critical:''' Kritische Systemfehler, die sofortiges Handeln erfordern. | ||
'''Strukturiertes Logging:''' Anstatt nur einfachen Text zu loggen ( | '''Strukturiertes Logging:''' | ||
Anstatt nur einfachen Text zu loggen ("User 'John' logged in"), nutzt ASP.NET Core '''Key-Value-Paare'''. | |||
* '''Vorteil:''' Erleichtert das Filtern und Analysieren in Tools wie Seq oder Elasticsearch erheblich. | * '''Vorteil:''' Erleichtert das Filtern und Analysieren in Tools wie Seq oder Elasticsearch erheblich. | ||
* '''Beispiel:''' <code>_logger.LogInformation( | * '''Beispiel:''' <code>_logger.LogInformation("User {UserName} logged in", user.UserName);</code> | ||
---- | |||
== 2. Dependency Injection & Controller == | |||
== 2. Dependency Injection & | |||
In ASP.NET Core erhältst du eine <code>ILogger</code>-Instanz normalerweise über Dependency Injection (DI). | In ASP.NET Core erhältst du eine <code>ILogger</code>-Instanz normalerweise über Dependency Injection (DI). | ||
<syntaxhighlight lang="csharp">public class PersonsController : Controller | <syntaxhighlight lang="csharp"> | ||
public class PersonsController : Controller | |||
{ | { | ||
private readonly ILogger<PersonsController> _logger; | private readonly ILogger<PersonsController> _logger; | ||
| Zeile 51: | Zeile 49: | ||
return View(); | return View(); | ||
} | } | ||
}</syntaxhighlight> | } | ||
</syntaxhighlight> | |||
''Der generische Typ <code>ILogger<T></code> legt den Kategorienamen fest (meist der Klassenname), was eine gezielte Filterung ermöglicht.'' | ''Der generische Typ <code>ILogger<T></code> legt den Kategorienamen fest (meist der Klassenname), was eine gezielte Filterung ermöglicht.'' | ||
---- | |||
== 3. Logging-Konfiguration (<code>appsettings.json</code>) == | == 3. Logging-Konfiguration (<code>appsettings.json</code>) == | ||
| Zeile 61: | Zeile 59: | ||
Die Steuerung der Logs erfolgt zentral in der <code>appsettings.json</code>. Hier legst du fest, ab welchem Schweregrad geloggt werden soll. | Die Steuerung der Logs erfolgt zentral in der <code>appsettings.json</code>. Hier legst du fest, ab welchem Schweregrad geloggt werden soll. | ||
<syntaxhighlight lang="json">{ | <syntaxhighlight lang="json"> | ||
{ | |||
"Logging": { | "Logging": { | ||
"LogLevel": { | "LogLevel": { | ||
| Zeile 68: | Zeile 67: | ||
} | } | ||
} | } | ||
}</syntaxhighlight> | } | ||
</syntaxhighlight> | |||
* <code>Default</code>: Gilt für fast alle Kategorien. | * <code>Default</code>: Gilt für fast alle Kategorien. | ||
* <code>Microsoft.AspNetCore</code>: Speziell für Framework-Logs (hier werden nur Warnungen oder Höherwertiges angezeigt). | * <code>Microsoft.AspNetCore</code>: Speziell für Framework-Logs (hier werden nur Warnungen oder Höherwertiges angezeigt). | ||
---- | |||
== 4. Logging-Provider == | == 4. Logging-Provider == | ||
| Zeile 80: | Zeile 79: | ||
'''Integrierte Provider:''' | '''Integrierte Provider:''' | ||
* '''Console:''' Ausgabe im Konsolenfenster. | * '''Console:''' Ausgabe im Konsolenfenster. | ||
* '''Debug:''' Ausgabe im Visual Studio Debug-Fenster. | * '''Debug:''' Ausgabe im Visual Studio Debug-Fenster. | ||
| Zeile 86: | Zeile 84: | ||
'''Drittanbieter (Empfohlen):''' | '''Drittanbieter (Empfohlen):''' | ||
* '''Serilog:''' Ein Kraftpaket für strukturiertes Logging mit vielen Zielorten ("Sinks"). | |||
* '''Serilog:''' Ein Kraftpaket für strukturiertes Logging mit vielen Zielorten ( | |||
* '''NLog / log4net:''' Etablierte Frameworks mit langer Historie. | * '''NLog / log4net:''' Etablierte Frameworks mit langer Historie. | ||
---- | |||
== 5. HTTP-Logging == | == 5. HTTP-Logging == | ||
| Zeile 98: | Zeile 94: | ||
'''Aktivierung in <code>Program.cs</code>:''' | '''Aktivierung in <code>Program.cs</code>:''' | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">var builder = WebApplication.CreateBuilder(args); | var builder = WebApplication.CreateBuilder(args); | ||
// Konfiguration der Felder | // Konfiguration der Felder | ||
| Zeile 109: | Zeile 105: | ||
var app = builder.Build(); | var app = builder.Build(); | ||
app.UseHttpLogging(); // Middleware hinzufügen</syntaxhighlight> | app.UseHttpLogging(); // Middleware hinzufügen | ||
</syntaxhighlight> | |||
'''Wichtige <code>HttpLoggingFields</code>:''' | '''Wichtige <code>HttpLoggingFields</code>:''' | ||
* <code>RequestMethod</code>, <code>RequestPath</code>, <code>RequestProtocol</code>. | * <code>RequestMethod</code>, <code>RequestPath</code>, <code>RequestProtocol</code>. | ||
* <code>ResponseStatusCode</code>. | * <code>ResponseStatusCode</code>. | ||
* <code>RequestBody</code> / <code>ResponseBody</code> (Achtung: Hoher Performance-Impact!). | * <code>RequestBody</code> / <code>ResponseBody</code> (Achtung: Hoher Performance-Impact!). | ||
---- | |||
== 6. Serilog: Profi-Logging == | == 6. Serilog: Profi-Logging == | ||
| Zeile 123: | Zeile 119: | ||
Serilog ist die bevorzugte Wahl für moderne .NET-Anwendungen. | Serilog ist die bevorzugte Wahl für moderne .NET-Anwendungen. | ||
'''Vorteile & | '''Vorteile & Sinks:''' | ||
Serilog nutzt sogenannte '''Sinks''', um Logs an verschiedene Ziele zu senden: | |||
* '''File Sink:''' Schreibt in Textdateien (unterstützt | * '''File Sink:''' Schreibt in Textdateien (unterstützt "Rolling Files" nach Zeit oder Größe). | ||
* '''MSSqlServer Sink:''' Speichert Logs direkt in einer SQL-Datenbank. | * '''MSSqlServer Sink:''' Speichert Logs direkt in einer SQL-Datenbank. | ||
* '''Seq Sink:''' Sendet Logs an Seq für Echtzeit-Suche und -Analyse. | * '''Seq Sink:''' Sendet Logs an Seq für Echtzeit-Suche und -Analyse. | ||
'''Erweiterte Funktionen:''' | '''Erweiterte Funktionen:''' | ||
* '''Enrichers:''' Fügt jedem Log-Eintrag Kontext hinzu (z.B. <code>MachineName</code> oder eine eindeutige <code>RequestId</code>). | * '''Enrichers:''' Fügt jedem Log-Eintrag Kontext hinzu (z.B. <code>MachineName</code> oder eine eindeutige <code>RequestId</code>). | ||
* '''IDiagnosticContext:''' Ermöglicht es, zusätzliche Eigenschaften während eines Requests zu sammeln und sie gesammelt am Ende zu loggen. | * '''IDiagnosticContext:''' Ermöglicht es, zusätzliche Eigenschaften während eines Requests zu sammeln und sie gesammelt am Ende zu loggen. | ||
| Zeile 136: | Zeile 131: | ||
'''Konfiguration (Beispiel für <code>Program.cs</code>):''' | '''Konfiguration (Beispiel für <code>Program.cs</code>):''' | ||
<syntaxhighlight lang="csharp"> | |||
<syntaxhighlight lang="csharp">builder.Host.UseSerilog((ctx, services, config) => config | builder.Host.UseSerilog((ctx, services, config) => config | ||
.ReadFrom.Configuration(ctx.Configuration) | .ReadFrom.Configuration(ctx.Configuration) | ||
.ReadFrom.Services(services));</syntaxhighlight> | .ReadFrom.Services(services)); | ||
</syntaxhighlight> | |||
---- | |||
== 7. Best Practices & | == 7. Best Practices & Interview-Tipps == | ||
'''Best Practices:''' | '''Best Practices:''' | ||
# '''Sorgfältige Auswahl:''' Wähle den Provider passend zum Projekt (Serilog ist meist die beste Wahl). | # '''Sorgfältige Auswahl:''' Wähle den Provider passend zum Projekt (Serilog ist meist die beste Wahl). | ||
# '''Strukturiertes Logging nutzen:''' Nutze Platzhalter wie <code>{UserName}</code> statt String-Interpolation. | # '''Strukturiertes Logging nutzen:''' Nutze Platzhalter wie <code>{UserName}</code> statt String-Interpolation. | ||
| Zeile 153: | Zeile 148: | ||
'''Interview-Fragen:''' | '''Interview-Fragen:''' | ||
* '''Warum strukturiertes Logging?''' Es macht Logs maschinenlesbar, was die Auswertung durch Tools (wie SQL-Abfragen in Seq) erst ermöglicht. | * '''Warum strukturiertes Logging?''' Es macht Logs maschinenlesbar, was die Auswertung durch Tools (wie SQL-Abfragen in Seq) erst ermöglicht. | ||
* '''Was ist der ILogger-Abstraktionsvorteil?''' Loose Coupling – die Geschäftslogik muss nicht wissen, ob die Logs in einer Datei, einer DB oder in der Cloud landen. | * '''Was ist der ILogger-Abstraktionsvorteil?''' Loose Coupling – die Geschäftslogik muss nicht wissen, ob die Logs in einer Datei, einer DB oder in der Cloud landen. | ||
* '''Was ist ein Sink in Serilog?''' Ein Zielort für Log-Ereignisse. | * '''Was ist ein Sink in Serilog?''' Ein Zielort für Log-Ereignisse. | ||
---- | |||
---- | |||
''Erstellt für Thorsten am 27. Februar 2026'' | ''Erstellt für Thorsten am 27. Februar 2026'' | ||
---- | ---- | ||
''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).'' | ''Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).'' | ||
Aktuelle Version vom 27. Februar 2026, 14:09 Uhr
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).
Logging ist ein unverzichtbares Werkzeug zur Überwachung, Fehlerbehebung und Gewinnung von Einblicken in das Verhalten deiner ASP.NET Core-Anwendung. Es dient als Fenster zu den Laufzeitereignissen deiner Anwendung und ermöglicht es dir, alles von Routineoperationen bis hin zu kritischen Fehlern zu verfolgen.
1. Das ILogger-Interface
Das Herzstück der Logging-Infrastruktur von ASP.NET Core ist das ILogger-Interface. Es bietet eine standardisierte Möglichkeit, Log-Meldungen, Warnungen, Fehler und andere Diagnoseinformationen auszugeben.
Kernaspekte:
- Abstraktion:
ILoggerist ein Interface. Das bedeutet, du kannst verschiedene Logging-Provider (Konsole, Datei, Datenbank, Cloud) einbinden, ohne deinen Anwendungscode ändern zu müssen. - Anpassungsfähigkeit: Du kannst Provider wechseln oder Konfigurationen nahtlos ändern, um sie an unterschiedliche Umgebungen anzupassen.
Log-Level (Schweregrade): Die Log-Level geben an, wie kritisch ein Ereignis ist:
- Trace: Sehr detailliert, meist nur für die Fehlersuche in der Entwicklung.
- Debug: Informationen für das Debugging, weniger ausführlich als Trace.
- Information: Nachrichten über den normalen Geschäftsverlauf.
- Warning: Ereignisse, die auf Probleme hinweisen könnten, aber die Anwendung nicht stoppen.
- Error: Ausnahmen oder Fehler, die die Benutzererfahrung beeinträchtigen könnten.
- Critical: Kritische Systemfehler, die sofortiges Handeln erfordern.
Strukturiertes Logging: Anstatt nur einfachen Text zu loggen ("User 'John' logged in"), nutzt ASP.NET Core Key-Value-Paare.
- Vorteil: Erleichtert das Filtern und Analysieren in Tools wie Seq oder Elasticsearch erheblich.
- Beispiel:
_logger.LogInformation("User {UserName} logged in", user.UserName);
2. Dependency Injection & Controller
In ASP.NET Core erhältst du eine ILogger-Instanz normalerweise über Dependency Injection (DI).
public class PersonsController : Controller
{
private readonly ILogger<PersonsController> _logger;
public PersonsController(ILogger<PersonsController> logger)
{
_logger = logger;
}
public IActionResult Index()
{
_logger.LogInformation("Die Index-Seite wurde aufgerufen.");
return View();
}
}
Der generische Typ ILogger<T> legt den Kategorienamen fest (meist der Klassenname), was eine gezielte Filterung ermöglicht.
3. Logging-Konfiguration (appsettings.json)
Die Steuerung der Logs erfolgt zentral in der appsettings.json. Hier legst du fest, ab welchem Schweregrad geloggt werden soll.
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
Default: Gilt für fast alle Kategorien.Microsoft.AspNetCore: Speziell für Framework-Logs (hier werden nur Warnungen oder Höherwertiges angezeigt).
4. Logging-Provider
Ein Provider bestimmt, wohin die Logs geschrieben werden.
Integrierte Provider:
- Console: Ausgabe im Konsolenfenster.
- Debug: Ausgabe im Visual Studio Debug-Fenster.
- EventLog: Schreibt in das Windows-Ereignisprotokoll (nur Windows).
Drittanbieter (Empfohlen):
- Serilog: Ein Kraftpaket für strukturiertes Logging mit vielen Zielorten ("Sinks").
- NLog / log4net: Etablierte Frameworks mit langer Historie.
5. HTTP-Logging
ASP.NET Core bietet Middleware, um HTTP-Requests und -Responses automatisch zu erfassen. Dies ist ideal für Performance-Analysen und Sicherheitsaudits.
Aktivierung in Program.cs:
var builder = WebApplication.CreateBuilder(args);
// Konfiguration der Felder
builder.Services.AddHttpLogging(logging =>
{
logging.LoggingFields = HttpLoggingFields.All;
});
var app = builder.Build();
app.UseHttpLogging(); // Middleware hinzufügen
Wichtige HttpLoggingFields:
RequestMethod,RequestPath,RequestProtocol.ResponseStatusCode.RequestBody/ResponseBody(Achtung: Hoher Performance-Impact!).
6. Serilog: Profi-Logging
Serilog ist die bevorzugte Wahl für moderne .NET-Anwendungen.
Vorteile & Sinks: Serilog nutzt sogenannte Sinks, um Logs an verschiedene Ziele zu senden:
- File Sink: Schreibt in Textdateien (unterstützt "Rolling Files" nach Zeit oder Größe).
- MSSqlServer Sink: Speichert Logs direkt in einer SQL-Datenbank.
- Seq Sink: Sendet Logs an Seq für Echtzeit-Suche und -Analyse.
Erweiterte Funktionen:
- Enrichers: Fügt jedem Log-Eintrag Kontext hinzu (z.B.
MachineNameoder eine eindeutigeRequestId). - IDiagnosticContext: Ermöglicht es, zusätzliche Eigenschaften während eines Requests zu sammeln und sie gesammelt am Ende zu loggen.
- Serilog Timings: Misst die Ausführungszeit von Codeblöcken.
Konfiguration (Beispiel für Program.cs):
builder.Host.UseSerilog((ctx, services, config) => config
.ReadFrom.Configuration(ctx.Configuration)
.ReadFrom.Services(services));
7. Best Practices & Interview-Tipps
Best Practices:
- Sorgfältige Auswahl: Wähle den Provider passend zum Projekt (Serilog ist meist die beste Wahl).
- Strukturiertes Logging nutzen: Nutze Platzhalter wie
{UserName}statt String-Interpolation. - Keine sensiblen Daten: Logge niemals Passwörter, Kreditkartennummern oder personenbezogene Daten direkt.
- Umgebungsanpassung: Nutze in der Produktion höhere Log-Level (z.B.
Warning), um die Performance nicht zu beeinträchtigen.
Interview-Fragen:
- Warum strukturiertes Logging? Es macht Logs maschinenlesbar, was die Auswertung durch Tools (wie SQL-Abfragen in Seq) erst ermöglicht.
- Was ist der ILogger-Abstraktionsvorteil? Loose Coupling – die Geschäftslogik muss nicht wissen, ob die Logs in einer Datei, einer DB oder in der Cloud landen.
- Was ist ein Sink in Serilog? Ein Zielort für Log-Ereignisse.
Erstellt für Thorsten am 27. Februar 2026
Hinweis: Diese Inhalte wurden mit Unterstützung von Künstlicher Intelligenz erstellt und redaktionell überprüft (Transparenzhinweis gemäß Art. 50 EU AI Act).