Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Istnieje wielu usługodawców logowania dostępnych dla typowych wymagań logowania. Może być konieczne zaimplementowanie niestandardowej ILoggerProvider, jeśli żaden z dostępnych dostawców nie odpowiada potrzebom Twojej aplikacji. W tym artykule dowiesz się, jak zaimplementować niestandardowy provider logowania, który umożliwia kolorowanie dzienników w konsoli.
Napiwek
Przykładowy kod źródłowy niestandardowego dostawcy rejestrowania jest dostępny w repozytorium GitHub Docs. Aby uzyskać więcej informacji, zobacz GitHub: .NET Docs — rejestrowanie danych konsoli.
Przykładowa niestandardowa konfiguracja rejestratora
Przykład tworzy kolorowe wpisy konsoli dla każdego poziomu dziennika i identyfikatora zdarzenia przy użyciu następującego typu konfiguracji:
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
};
}
Powyższy kod ustawia domyślny poziom na Information
, kolor Green
, a EventId
jest niejawnie 0
.
Utwórz niestandardowy rejestrator
Nazwa kategorii implementacji ILogger
jest zazwyczaj źródłem rejestrowania. Na przykład typ, gdzie jest tworzony rejestrator:
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();
}
}
}
Powyższy kod:
- Tworzy wystąpienie rejestratora dla każdej nazwy kategorii.
- Sprawdza
_getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel)
wIsEnabled
, więc każdylogLevel
ma unikatowy rejestrator. W tej implementacji każdy poziom logowania wymaga jawnego wpisu konfiguracyjnego, aby się rejestrować.
Dobrym rozwiązaniem jest wywołanie ILogger.IsEnabled w ramach implementacji ILogger.Log, ponieważ Log
może być wywoływana przez dowolnego konsumenta i nie ma gwarancji, że została ona wcześniej sprawdzona. Metoda IsEnabled
powinna być bardzo szybka w większości implementacji.
TState state,
Exception? exception,
Rejestrator jest tworzony przy użyciu name
i Func<ColorConsoleLoggerConfiguration>
, co zwraca bieżącą konfigurację — obsługuje on aktualizacje wartości konfiguracji monitorowanych za pośrednictwem wywołania zwrotnego IOptionsMonitor<TOptions>.OnChange.
Ważny
Implementacja ILogger.Log sprawdza, czy ustawiono wartość config.EventId
. Jeśli config.EventId
nie jest ustawione lub gdy dokładnie odpowiada logEntry.EventId
, rejestrator wyświetla informacje w kolorze.
Niestandardowy dostawca rejestratora
Obiekt ILoggerProvider
jest odpowiedzialny za tworzenie instancji loggera. Nie jest konieczne utworzenie wystąpienia rejestratora dla każdej kategorii, ale w przypadku niektórych rejestratorów, takich jak NLog lub log4net, może to mieć sens. Ta strategia pozwala wybrać różne cele wyjściowe rejestrowania dla każdej kategorii, jak w poniższym przykładzie:
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();
}
}
W poprzednim kodzie CreateLogger tworzy pojedyncze wystąpienie ColorConsoleLogger
dla każdej nazwy kategorii i przechowuje je w ConcurrentDictionary<TKey,TValue>
. Ponadto interfejs IOptionsMonitor<TOptions> jest wymagany do aktualizowania zmian obiektu ColorConsoleLoggerConfiguration
bazowego.
Aby kontrolować konfigurację ColorConsoleLogger
, należy zdefiniować alias u dostawcy:
[UnsupportedOSPlatform("browser")]
[ProviderAlias("ColorConsole")]
public sealed class ColorConsoleLoggerProvider : ILoggerProvider
Klasa ColorConsoleLoggerProvider
definiuje dwa atrybuty o zakresie klasy:
-
UnsupportedOSPlatformAttribute: Typ
ColorConsoleLogger
jest nieobsługiwany w"browser"
. -
ProviderAliasAttribute: sekcje konfiguracji mogą definiować opcje przy użyciu klucza
"ColorConsole"
.
Konfigurację można określić przy użyciu dowolnego prawidłowego dostawcy konfiguracji . Rozważmy następujący plik appsettings.json:
{
"Logging": {
"ColorConsole": {
"LogLevelToColorMap": {
"Information": "DarkGreen",
"Warning": "Cyan",
"Error": "Red"
}
}
}
}
Spowoduje to skonfigurowanie poziomów dziennika na następujące wartości:
- LogLevel.Information: ConsoleColor.DarkGreen
- LogLevel.Warning: ConsoleColor.Cyan
- LogLevel.Error: ConsoleColor.Red
Poziom dziennika Information jest ustawiony na wartość DarkGreen, która zastępuje wartość domyślną ustawioną w obiekcie ColorConsoleLoggerConfiguration
.
Użycie i rejestracja niestandardowego rejestratora
Zgodnie z konwencją rejestrowanie usług do wstrzykiwania zależności odbywa się w ramach procedury uruchamiania aplikacji. Rejestracja odbywa się w klasie Program
lub może być delegowana do klasy Startup
. W tym przykładzie zarejestrujesz się bezpośrednio z Program.cs.
Aby dodać niestandardowego dostawcę rejestrowania i odpowiedni rejestrator, dodaj ILoggerProvider z ILoggingBuilder z HostingHostBuilderExtensions.ConfigureLogging(IHostBuilder, Action<ILoggingBuilder>):
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
tworzy jedno lub więcej wystąpień ILogger
. Wystąpienia ILogger
są używane przez platformę do rejestrowania informacji.
Konfiguracja z pliku appsettings.json zastępuje następujące wartości:
Zgodnie z konwencją metody rozszerzeń w ILoggingBuilder
są używane do rejestrowania dostawcy niestandardowego:
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;
}
}
Uruchomienie tej prostej aplikacji spowoduje wyświetlenie kolorowego wyjścia w oknie konsoli, podobnie jak na poniższym obrazie.
przykładowe dane wyjściowe rejestratora kolorów konsoli
Zobacz też
- rejestrowanie na platformie .NET
- dostawcy rejestrowania na platformie .NET
- wstrzykiwanie zależności na platformie .NET
- Logowanie o wysokiej wydajności na platformie .NET