Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Terdapat banyak penyedia layanan pencatatan log tersedia untuk kebutuhan pencatatan log yang umum. Tetapi Anda mungkin perlu menerapkan kustom ILoggerProvider ketika salah satu penyedia yang tersedia tidak sesuai dengan kebutuhan aplikasi Anda. Dalam artikel ini, Anda mempelajari cara menerapkan penyedia pengelogan kustom yang dapat digunakan untuk mewarnai log di konsol.
Petunjuk / Saran
Contoh kode sumber penyedia pengelogan kustom tersedia di repositori GitHub dokumen.
Contoh konfigurasi pencatat kustom
Pencatat sampel membuat entri konsol warna yang berbeda per tingkat log dan ID peristiwa menggunakan jenis konfigurasi berikut:
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
};
}
Kode sebelumnya mengatur warna default untuk tingkat ke InformationGreen. Nilai EventId secara implisit adalah 0.
Membuat pencatat kustom
Cuplikan kode di bawah ini menunjukkan implementasi dari 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();
}
}
}
Setiap instance pencatat diinisialisasi dengan meneruskan nama kategori, yang biasanya merupakan tipe tempat pencatat dibuat. Metode IsEnabled memeriksa getCurrentConfig().LogLevelToColorMap.ContainsKey(logLevel) untuk melihat apakah tingkat log yang diminta sudah diaktifkan (yaitu, dalam kamus konfigurasi tingkat log).
Ini adalah praktik yang baik untuk memanggil ILogger.IsEnabled dalam implementasi ILogger.Log karena Log dapat dipanggil oleh konsumen mana pun, dan tidak ada jaminan bahwa itu sebelumnya diperiksa. Metode IsEnabled harus sangat cepat dalam sebagian besar implementasi.
if (!IsEnabled(logLevel))
{
return;
}
Logger diinstansiasi dengan name dan sebuah Func<ColorConsoleLoggerConfiguration> yang mengembalikan konfigurasi saat ini.
Penting
Implementasi ILogger.Log memeriksa apakah nilai config.EventId ditetapkan. Ketika config.EventId tidak diatur atau ketika sesuai tepat dengan logEntry.EventId, log dicatat dalam warna.
Penyedia pencatat kustom
Objek ILoggerProvider bertanggung jawab untuk membuat instans pencatat. Tidak perlu membuat instans pencatat per kategori, tetapi masuk akal untuk beberapa pencatat, seperti NLog atau log4net. Strategi ini memungkinkan Anda memilih target output pengelogan yang berbeda per kategori, seperti dalam contoh berikut:
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();
}
}
Dalam kode sebelumnya, CreateLogger(String) membuat satu instans ColorConsoleLogger per nama kategori dan menyimpannya di ConcurrentDictionary<TKey,TValue>.
Kelas ColorConsoleLoggerProvider dihiasi dengan dua atribut:
[UnsupportedOSPlatform("browser")]
[ProviderAlias("ColorConsole")]
public sealed class ColorConsoleLoggerProvider : ILoggerProvider
-
UnsupportedOSPlatformAttribute: Jenis
ColorConsoleLoggertidak didukung di"browser". -
ProviderAliasAttribute: Bagian konfigurasi dapat menentukan opsi menggunakan kunci
"ColorConsole".
Konfigurasi dapat ditentukan dengan penyedia konfigurasi yang valid . Pertimbangkan file appsettings.json berikut:
{
"Logging": {
"ColorConsole": {
"LogLevelToColorMap": {
"Information": "DarkGreen",
"Warning": "Cyan",
"Error": "Red"
}
}
}
}
File appsettings.json menentukan bahwa warna untuk tingkat log Information adalah DarkGreen, yang menggantikan nilai default yang diatur dalam objek ColorConsoleLoggerConfiguration.
Penggunaan dan pendaftaran pencatat kustom
Menurut konvensi, layanan terdaftar untuk injeksi dependensi sebagai bagian dari rutinitas startup aplikasi. Dalam contoh ini, layanan pengelogan didaftarkan langsung dari file Program.cs .
Untuk menambahkan penyedia pencatatan kustom dan logger yang sesuai ILoggerProvider, tambahkan dengan memanggil metode ekstensi kustom, AddColorConsoleLogger, pada ILoggingBuilder dari properti IHostApplicationBuilder.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();
Menurut konvensi, metode ekstensi pada ILoggingBuilder digunakan untuk mendaftarkan penyedia kustom:
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 membuat satu atau beberapa instans ILogger. Instans ILogger digunakan oleh kerangka kerja untuk mencatat informasi.
Kode instansiasi mengambil alih nilai warna dari file appsettings.json untuk LogLevel.Warning dan LogLevel.Error.
Saat Anda menjalankan aplikasi sederhana ini, aplikasi ini merender output warna ke jendela konsol yang mirip dengan gambar berikut: