Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Számos naplózási szolgáltató érhető el a gyakori naplózási igényekhez. Azonban előfordulhat, hogy egyedi megoldást ILoggerProvider kell megvalósítania, ha az egyik elérhető szolgáltató nem felel meg az alkalmazás igényeinek. Ebből a cikkből megtudhatja, hogyan valósíthat meg egyéni naplózási szolgáltatót, amely a naplók színezésére használható a konzolon.
Jótanács
Az egyéni naplózási szolgáltató példaforráskódja a GitHub-adattárban érhető el.
Minta egyéni naplózó konfigurációja
A mintanaplózó naplószintenként és eseményazonosítónként különböző színkonzol-bejegyzéseket hoz létre a következő konfigurációtípus használatával:
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
};
}
Az előző kód a szint Informationalapértelmezett színét Green állítja be . Az EventId alapértelmezés szerint 0 értéke.
Az egyéni naplózó létrehozása
Az alábbi kódrészlet a megvalósítást ILogger mutatja be:
using Microsoft.Extensions.Logging;
public sealed class ColorConsoleLogger(
string name,
Func<ColorConsoleLoggerConfiguration> getCurrentConfig) : ILogger
{
public IDisposable? BeginScope<TState>(TState state)
where TState : notnull => default!;
public bool IsEnabled(LogLevel logLevel) =>
getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel);
public void Log<TState>(
LogLevel logLevel,
EventId eventId,
TState state,
Exception? exception,
Func<TState, Exception?, string> formatter)
{
if (!IsEnabled(logLevel))
{
return;
}
ColorConsoleLoggerConfiguration config = getCurrentConfig();
if (config.EventId == 0 || config.EventId == eventId.Id)
{
ConsoleColor originalColor = Console.ForegroundColor;
Console.ForegroundColor = config.LogLevelToColorMap[logLevel];
Console.WriteLine($"[{eventId.Id,2}: {logLevel,-12}]");
Console.ForegroundColor = originalColor;
Console.Write($" {name} - ");
Console.ForegroundColor = config.LogLevelToColorMap[logLevel];
Console.Write($"{formatter(state, exception)}");
Console.ForegroundColor = originalColor;
Console.WriteLine();
}
}
}
Minden naplózópéldány egy kategórianév átadásával jön létre, amely általában az a típus, ahol a naplózópéldány létrejön. A IsEnabled metódus ellenőrzi getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel) , hogy engedélyezve van-e a kért naplószint (azaz a konfiguráció naplószintek szótárában).
Ajánlott a ILogger.IsEnabled-t a ILogger.Log implementációkon belül meghívni, mivel Log-t bármely fogyasztó is meghívhatja, és nincs garancia arra, hogy korábban ellenőrizték. A IsEnabled módszernek nagyon gyorsnak kell lennie a legtöbb implementációban.
if (!IsEnabled(logLevel))
{
return;
}
A naplózó példányosítása a name és egy Func<ColorConsoleLoggerConfiguration> segítségével történik, amely visszaadja az aktuális konfigurációt.
Fontos
A ILogger.Log implementáció ellenőrzi, hogy a config.EventId érték be van-e állítva. Ha a config.EventId nincs beállítva, vagy ha a config.EventId pontosan megegyezik a(z) -nel, akkor a naplózó színesen rögzít.
Egyéni naplózási szolgáltató
A ILoggerProvider objektum felelős a naplózópéldányok létrehozásáért. Nem szükséges kategóriánként létrehozni egy naplózópéldányt, de van értelme néhány naplózónak, például az NLognak vagy a log4netnek. Ez a stratégia lehetővé teszi, hogy kategóriánként különböző naplózási kimeneti célokat válasszon, ahogyan az alábbi példában is látható:
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();
}
}
Az előző kódban a CreateLogger(String) minden kategórianévhez egyetlen példányt hoz létre a ColorConsoleLogger-ből, és azt a ConcurrentDictionary<TKey,TValue>tárolja.
Az ColorConsoleLoggerProvider osztályt két attribútum díszíti:
[UnsupportedOSPlatform("browser")]
[ProviderAlias("ColorConsole")]
public sealed class ColorConsoleLoggerProvider : ILoggerProvider
-
UnsupportedOSPlatformAttribute: A
ColorConsoleLoggertípus nem támogatott a"browser". -
ProviderAliasAttribute: A konfigurációs szakaszok a
"ColorConsole"kulccsal határozhatják meg a beállításokat.
A konfiguráció bármely érvényes konfigurációszolgáltatóvaladható meg. Vegye figyelembe a következő appsettings.json fájlt:
{
"Logging": {
"ColorConsole": {
"LogLevelToColorMap": {
"Information": "DarkGreen",
"Warning": "Cyan",
"Error": "Red"
}
}
}
}
A appsettings.json fájl azt határozza meg, hogy a Information naplószint színe felülbírálja DarkGreenaz objektumban ColorConsoleLoggerConfiguration beállított alapértelmezett értéket.
Az egyéni naplózó használata és regisztrálása
Konvenció szerint a szolgáltatások az alkalmazás indítási rutinjának részeként regisztrálva vannak a függőséginjektáláshoz. Ebben a példában a naplózási szolgáltatás közvetlenül a Program.cs fájlból van regisztrálva.
Az egyéni naplózási szolgáltató és a megfelelő naplózó hozzáadásához adjon hozzá egy ILoggerProvider egyéni bővítménymetódus meghívásával a AddColorConsoleLoggerILoggingBuildertulajdonságbólIHostApplicationBuilder.Logging:
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 value of "Cyan" from appsettings.json.
configuration.LogLevelToColorMap[LogLevel.Warning]
= ConsoleColor.DarkCyan;
// Replace value of "Red" from appsettings.json.
configuration.LogLevelToColorMap[LogLevel.Error]
= ConsoleColor.DarkRed;
});
using IHost host = builder.Build();
ILogger<Program> 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();
A konvenció szerint a kiterjesztési metódusokkal a ILoggingBuilder-on regisztrálják az egyéni szolgáltatót.
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;
}
}
A ILoggingBuilder létrehoz egy vagy több ILogger példányt. A keretrendszer a ILogger-példányokat használja az adatok naplózásához.
A példánykód felülírja a appsettings.json fájlból származó színértékeket LogLevel.Warning és LogLevel.Error számára.
Az egyszerű alkalmazás futtatásakor a következő képhez hasonló színkimenet jelenik meg a konzolablakban: