Logování pomocí Serilogu a Seq
24.02.2021Logování je nedílnou součástí každé aplikace nebo systému. V tomto článku si ukážeme, jak nakonfigurovat Seq server, který umožňuje agregaci všech aplikačních logů. Díky tomu můžeme logy snadno procházet a rychle identifikovat například chyby nebo pomalé požadavky.
Slovníček
ASP.NET Core | Open-source webový framework od Microsoftu (první release 2016). |
Serilog | Populární knihovna pro logování v .NET aplikacích, podporující strukturované logy. |
Seq | Komerční profesionální nástroj pro monitorování logů od společnosti Datalust. |
Obsah
Úvod
Nejprve nainstalujeme Seq server, který bude naslouchat na localhostu. Následně vygenerujeme aplikační klíč sloužící k autorizaci. Nakonec vytvoříme jednoduchou ASP.NET Core aplikaci, ve které nakonfigurujeme Serilog a nastavíme odesílání logů na Seq server. Konfiguraci Serilogu budeme načítat ze souboru appsettings.json, což nám umožní za běhu měnit úroveň logování (log level). Autorizační klíč načteme z environment proměnných (v našem případě na IIS serveru), aby se nedostal do verzovacího systému.
Nastavení Seq
Proces instalace je jednoduchý. Stačí stáhnout instalační balíček, spustit instalaci a zvolit, zda chcete konfiguraci služby provést pomocí průvodce (wizardu). Pokud ne, můžete konfiguraci kdykoliv provést nebo později upravit pomocí příkazu seq, který umožňuje také přeinstalaci služby. Během konfigurace lze nastavit
- URL adresu, na které bude služba naslouchat.
- Cestu k úložišti logů.
- SSL thumbprint.
- Administrátorské jméno s heslem.
Vygenerování aplikačního klíče
Otevřeme Seq ve webovém prohlížeči a přejdeme do záložky settings > API Keys, kterou najdeme na adrese http://localhost:5341/#/settings/api-keys. Zde zaškrtneme možnost vyžadovat autorizaci před přijetím jakýchkoliv logů serverem.
Nastavení IIS
Aby si aplikace mohla načíst autorizační klíč z environment proměnných, můžeme klíč nastavit přímo v IIS. Jak nastavit proměnnou popisuji v předchozím článku. Naše proměnná musí být v souladu se Serilog nastavením, které budeme mít v appsettings.json configu. Info jak nastavit proměnnou, aby se načetla v rámci správné sekce appsettings souboru, najdeme v dokumentaci. V našem případě je to Serilog__WriteTo__0__Args_apiKey.
Nastavení Serilogu
V ASP.NET Core aplikaci nainstalujeme knihovnu Serilog s podporou Seq pomocí balíčkovacího nástroje NuGet.
Install-Package Serilog.AspNetCore
Install-Package Serilog.Sinks.Seq -DependencyVersion Highest
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog(
(context, services, configuration) =>
{
configuration
// Load serilog section from appsettings.json
// https://github.com/serilog/serilog-settings-configuration
.ReadFrom.Configuration(context.Configuration)
// Enable pushing properties
// https://github.com/serilog/serilog-aspnetcore#pushing-properties-to-the-iloggert
.Enrich.FromLogContext();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
Hlavní nastavení se nachází v již zmíněném konfiguračním souboru appsettings.json. V tomto souboru nahradíme sekci Logging sekcí Serilog. Konfigurace Seq musí být uvedena na první pozici v sekci WriteTo, protože jsme environment proměnnou nastavili jako Serilog__WriteTo__0__Args_apiKey.
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.Seq" ],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Seq",
"Args": {
"serverUrl": "http://localhost:5341",
// We can change log level in runtime when needed.
"restrictedToMinimumLevel": "Information",
// Api key is loaded from IIS environment variables storage.
// For local development, key should be in secrets.json.
// https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-5.0&tabs=windows
// "apiKey": "iBR56916yONxYlN4dAIr"
}
},
{
"Name": "Console",
"args": {
"restrictedToMinimumLevel": "Error"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
// We set application name property already in Seq API key settings.
//"Properties": {
// "Application": "WebApp"
//}
}
V souboru Starup.cs v metodě Configure si můžeme donastavit Serilog konfiguraci a můžeme si například do všech logů přidat proměnné Environment a User.
// Customizing what to log
// https://github.com/serilog/serilog-aspnetcore#request-logging
app.UseSerilogRequestLogging(options =>
{
// Attach additional properties to the request completion event
options.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
diagnosticContext.Set("Environment", Environment.EnvironmentName);
diagnosticContext.Set("User", httpContext.User.Identity.Name);
};
});
Závěr
Nyní máme již vše připravené. Po vypublikování aplikace na IIS server by se měly logy začít zobrazovat na Seq serveru, kde si je můžeme jednoduše filtrovat podle potřeby. Případný alerting si můžeme nastavit podle dokumentace.