Implementace vlastního zprostředkovatele protokolování v .NET
Článek
Existuje mnoho poskytovatelů protokolování k dispozici pro běžné potřeby protokolování. Možná budete muset implementovat vlastní ILoggerProvider, pokud některý z dostupných poskytovatelů nevyhovuje potřebám vaší aplikace. V tomto článku se dozvíte, jak implementovat vlastního zprostředkovatele protokolování, který se dá použít k obarvení protokolů v konzole.
Ukázka vytvoří různé položky barevné konzoly pro každou úroveň protokolu a ID události pomocí následujícího typu konfigurace:
using Microsoft.Extensions.Logging;
public sealed class ColorConsoleLoggerConfiguration
{
public int EventId { get; set; }
public Dictionary<LogLevel, ConsoleColor> LogLevelToColorMap { get; set; } = new()
{
[LogLevel.Information] = ConsoleColor.Green
};
}
Předchozí kód nastaví výchozí úroveň na Information, barvu na Greena EventId je implicitně 0.
Vytvořte vlastní protokolovací nástroj
Název kategorie implementace "ILogger" je obvykle používán jako zdroj protokolování. Například typ, ve kterém je protokolovač vytvořen:
Vytvoří instanci protokolovacího nástroje pro každý název kategorie.
Kontroluje _getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel) v IsEnabled, takže každý logLevel má jedinečný logger. V této implementaci vyžaduje každá úroveň záznamu explicitní položku konfigurace pro zaznamenávání.
Je dobrým zvykem volat ILogger.IsEnabled v rámci implementací ILogger.Log, protože Log může využívat jakýkoli spotřebitel a není zaručeno, že to bylo dříve zkontrolováno. Metoda IsEnabled by měla být ve většině implementací velmi rychlá.
TState state,
Exception? exception,
Protokolovací nástroj je instancován s name a Func<ColorConsoleLoggerConfiguration>, která vrací aktuální konfiguraci – zpracovává monitorované aktualizace konfiguračních hodnot prostřednictvím zpětného volání IOptionsMonitor<TOptions>.OnChange.
Důležité
Implementace ILogger.Log zkontroluje, jestli je nastavena hodnota config.EventId. Pokud config.EventId není nastaven nebo když odpovídá přesně logEntry.EventId, logger zaznamenává barevně.
Vlastní poskytovatel protokolu
Objekt ILoggerProvider zodpovídá za vytváření instancí loggeru. Není nutné vytvořit instanci protokolovacího nástroje pro každou kategorii, ale dává smysl pro některé protokolovací nástroje, jako je NLog nebo log4net. Tato strategie umožňuje zvolit různé cíle výstupu protokolování pro každou kategorii, jak je znázorněno v následujícím příkladu:
using System.Collections.Concurrent;
using System.Runtime.Versioning;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
[UnsupportedOSPlatform("browser")]
[ProviderAlias("ColorConsole")]
public sealed class ColorConsoleLoggerProvider : ILoggerProvider
{
private readonly IDisposable? _onChangeToken;
private ColorConsoleLoggerConfiguration _currentConfig;
private readonly ConcurrentDictionary<string, ColorConsoleLogger> _loggers =
new(StringComparer.OrdinalIgnoreCase);
public ColorConsoleLoggerProvider(
IOptionsMonitor<ColorConsoleLoggerConfiguration> config)
{
_currentConfig = config.CurrentValue;
_onChangeToken = config.OnChange(updatedConfig => _currentConfig = updatedConfig);
}
public ILogger CreateLogger(string categoryName) =>
_loggers.GetOrAdd(categoryName, name => new ColorConsoleLogger(name, GetCurrentConfig));
private ColorConsoleLoggerConfiguration GetCurrentConfig() => _currentConfig;
public void Dispose()
{
_loggers.Clear();
_onChangeToken?.Dispose();
}
}
Úroveň protokolu Information je nastavená na DarkGreen, která přepíše výchozí hodnotu nastavenou v objektu ColorConsoleLoggerConfiguration.
Použití a registrace vlastního protokolovacího nástroje
Podle konvence probíhá registrace služeb pro injektáž závislostí jako součást rutiny spouštění aplikace. Registrace probíhá v Program třídě nebo může být delegována do třídy Startup. V tomto příkladu se zaregistrujete přímo z Program.cs.
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddColorConsoleLogger(configuration =>
{
// Replace warning value from appsettings.json of "Cyan"
configuration.LogLevelToColorMap[LogLevel.Warning] = ConsoleColor.DarkCyan;
// Replace warning value from appsettings.json of "Red"
configuration.LogLevelToColorMap[LogLevel.Error] = ConsoleColor.DarkRed;
});
using IHost host = builder.Build();
var logger = host.Services.GetRequiredService<ILogger<Program>>();
logger.LogDebug(1, "Does this line get hit?"); // Not logged
logger.LogInformation(3, "Nothing to see here."); // Logs in ConsoleColor.DarkGreen
logger.LogWarning(5, "Warning... that was odd."); // Logs in ConsoleColor.DarkCyan
logger.LogError(7, "Oops, there was an error."); // Logs in ConsoleColor.DarkRed
logger.LogTrace(5, "== 120."); // Not logged
await host.RunAsync();
ILoggingBuilder vytváří jednu nebo více instancí ILogger.
ILogger instance jsou používány architekturou k protokolování informací.
Konfigurace ze souboru appsettings.json přepíše následující hodnoty:
Podle konvence se metody rozšíření ILoggingBuilder používají k registraci vlastního poskytovatele:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Configuration;
public static class ColorConsoleLoggerExtensions
{
public static ILoggingBuilder AddColorConsoleLogger(
this ILoggingBuilder builder)
{
builder.AddConfiguration();
builder.Services.TryAddEnumerable(
ServiceDescriptor.Singleton<ILoggerProvider, ColorConsoleLoggerProvider>());
LoggerProviderOptions.RegisterProviderOptions
<ColorConsoleLoggerConfiguration, ColorConsoleLoggerProvider>(builder.Services);
return builder;
}
public static ILoggingBuilder AddColorConsoleLogger(
this ILoggingBuilder builder,
Action<ColorConsoleLoggerConfiguration> configure)
{
builder.AddColorConsoleLogger();
builder.Services.Configure(configure);
return builder;
}
}
Spuštění této jednoduché aplikace vykreslí barevný výstup do okna konzoly podobně jako na následujícím obrázku:
Zdroj tohoto obsahu najdete na GitHubu, kde můžete také vytvářet a kontrolovat problémy a žádosti o přijetí změn. Další informace najdete v našem průvodci pro přispěvatele.
Zpětná vazba k produktu .NET
.NET je open source projekt. Vyberte odkaz pro poskytnutí zpětné vazby:
Zjistěte, jak můžete zaznamenat výstup trasování z webových aplikací Azure. Prohlédněte si stream dynamického protokolu a stáhněte si soubory protokolu pro offline analýzu.
Naučte se používat a implementovat vlastní formátování protokolu konzoly v aplikacích .NET. Zaregistrujte a vytvořte nové protokolovací moduly pro lepší protokolování aplikace.
Zjistěte, jak zpřístupnit protokolování jako autor knihovny v .NET. Postupujte podle pokynů a ujistěte se, že je knihovna správně přístupná uživatelům.