일반적인 로깅 요구 사항에 사용할 수 많은 로깅 공급자가 있습니다. 그러나 사용 가능한 공급자 중 하나가 애플리케이션 요구 사항에 맞지 않는 경우 사용자 지정 ILoggerProvider 을 구현해야 할 수 있습니다. 이 문서에서는 콘솔에서 로그의 색을 지정하는 데 사용할 수 있는 사용자 지정 로깅 공급자를 구현하는 방법을 알아봅니다.
팁 (조언)
사용자 지정 로깅 공급자 예제 소스 코드는 문서 GitHub 리포지토리에서 사용할 수 있습니다.
샘플 사용자 지정 로거 구성
샘플 로거는 다음 구성 유형을 사용하여 로그 수준 및 이벤트 ID당 다른 색 콘솔 항목을 만듭니다.
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
};
}
위의 코드는 수준에 대한 기본 색을 Information로 Green 설정합니다.
EventId 암시적으로 0입니다.
사용자 지정 로거 만들기
다음 코드 조각은 ILogger 구현을 보여줍니다.
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();
}
}
}
각 로거 인스턴스는 일반적으로 로거가 만들어지는 형식인 범주 이름을 전달하여 인스턴스화됩니다. 메서드 IsEnabled가 요청된 로그 수준(즉, 구성의 로그 수준 사전)이 활성화되었는지를 확인하기 위해 getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel)를 검사합니다.
모든 소비자가 ILogger.IsEnabled 호출할 수 있고 이전에 확인되었다는 보장은 없으므로 ILogger.Log 구현 내에서 Log 호출하는 것이 좋습니다.
IsEnabled 메서드는 대부분의 구현에서 매우 빠릅니다.
if (!IsEnabled(logLevel))
{
return;
}
로거는 name과 Func<ColorConsoleLoggerConfiguration>로 현재 구성을 반환하는 객체와 함께 인스턴스화됩니다.
중요합니다
ILogger.Log 구현은 config.EventId 값이 설정되어 있는지 확인합니다.
config.EventId 설정되지 않았거나 정확한 logEntry.EventId일치하면 로거가 색으로 기록됩니다.
사용자 지정 로거 공급자
ILoggerProvider 개체는 로거 인스턴스를 만듭니다. 범주별로 로거 인스턴스를 만들 필요는 없지만 NLog 또는 log4net과 같은 일부 로거에 적합합니다. 이 전략을 사용하면 다음 예제와 같이 범주별로 다른 로깅 출력 대상을 선택할 수 있습니다.
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();
}
}
앞의 코드에서 CreateLogger(String) 범주 이름당 ColorConsoleLogger 단일 인스턴스를 만들고 ConcurrentDictionary<TKey,TValue>저장합니다.
클래스는 ColorConsoleLoggerProvider 다음 두 가지 특성으로 데코레이팅됩니다.
[UnsupportedOSPlatform("browser")]
[ProviderAlias("ColorConsole")]
public sealed class ColorConsoleLoggerProvider : ILoggerProvider
-
UnsupportedOSPlatformAttribute:
ColorConsoleLogger형식은 에서"browser". -
ProviderAliasAttribute: 구성 섹션에서는
"ColorConsole"키를 사용하여 옵션을 정의할 수 있습니다.
구성은 유효한 구성 공급자사용하여 지정할 수 있습니다. 다음 appsettings.json 파일을 고려하세요.
{
"Logging": {
"ColorConsole": {
"LogLevelToColorMap": {
"Information": "DarkGreen",
"Warning": "Cyan",
"Error": "Red"
}
}
}
}
appsettings.json 파일은 로그 수준의 색이 DarkGreen, ColorConsoleLoggerConfiguration 개체에 설정된 기본값을 재정의하도록 지정합니다.
사용자 지정 로거의 사용 및 등록
규칙에 따라 서비스는 애플리케이션의 시작 루틴의 일부로 종속성 주입을 위해 등록됩니다. 이 예제에서는 로깅 서비스가 Program.cs 파일에서 직접 등록됩니다.
사용자 지정 로깅 공급자와 해당 로거를 추가하려면, IHostApplicationBuilder.Logging 속성의 ILoggingBuilder에서 사용자 지정 확장 메서드 AddColorConsoleLogger를 호출하여 ILoggerProvider를 추가하세요.
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();
규칙에 따라 ILoggingBuilder 확장 메서드는 사용자 지정 공급자를 등록하는 데 사용됩니다.
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;
}
}
ILoggingBuilder 하나 이상의 ILogger 인스턴스를 만듭니다.
ILogger 인스턴스는 프레임워크에서 정보를 기록하는 데 사용됩니다.
인스턴스화 코드는 appsettings.json 파일에서 LogLevel.Warning 및 LogLevel.Error의 색 값을 재정의합니다.
이 간단한 앱을 실행하면 다음 이미지와 유사한 색 출력이 콘솔 창에 렌더링됩니다.
참고하십시오
.NET