Özet - Günlükleme
- C# kursu
- İleri seviye
- Ders 78/83
- 5 dk
ILogger, seviyeler ve provider'ları birleştirerek bir günlükleme örneği yazarsın.
Günlüklemeyi hatırla
Bu grupta günlükleme temellerini gördük: ILogger<T> arayüzü, dört seviye (LogDebug, LogInformation, LogWarning, LogError), yüksek performans için LoggerMessage.Define, adlandırılmış yer tutucularla yapılandırılmış günlükleme ve Console/Debug sağlayıcıları.
İyi günlükleme üç özelliğe sahiptir: seçici (her şeyi yazmaz), yapılandırılmış (sorgulanabilir alanlar) ve hedefe uygun (Console canlı izleme, Debug geliştirme, dosya üretim arşivi). Şimdi öğrendiklerimizi birleşik örnekte uygulayalım.
Uygulama UserService ile yapılandırılmış günlük
Bir ILogger<T> arayüzü tanımla; void LogInformation(string message, params object[] args) metodu olsun. ConsoleLogger<T> sınıfı her {...} yer tutucusunu sıradaki argümanla değiştirip Console.WriteLine("[INF] " + message) yapsın. UserService sınıfı kurucudan ILogger<UserService> alsın; Greet(string user) metodu _logger.LogInformation("Merhaba {User}", user) çağrısı yapsın. Main'de bir ConsoleLogger<UserService> yarat ve Greet("Ayşe") çağır.
Başlangıç kodu
using System;
// ILogger<T> (params), ConsoleLogger<T> ve UserService sınıflarını ekle
class Program
{
static void Main()
{
// UserService'e ConsoleLogger ver ve Greet çağır
}
}Örnek çözüm
using System;
public interface ILogger<T>
{
void LogInformation(string message, params object[] args);
}
public class ConsoleLogger<T> : ILogger<T>
{
public void LogInformation(string message, params object[] args)
{
int i = 0;
while (i < args.Length)
{
int s = message.IndexOf('{');
if (s < 0) break;
int e = message.IndexOf('}', s);
if (e < 0) break;
message = message.Substring(0, s) + args[i] + message.Substring(e + 1);
i++;
}
Console.WriteLine("[INF] " + message);
}
}
class UserService
{
private readonly ILogger<UserService> _logger;
public UserService(ILogger<UserService> logger) => _logger = logger;
public void Greet(string user) =>
_logger.LogInformation("Merhaba {User}", user);
}
class Program
{
static void Main()
{
var service = new UserService(new ConsoleLogger<UserService>());
service.Greet("Ayşe");
}
}Beklenen çıktı
[INF] Merhaba Ayşe
Uygulama LoggerMessage ile derlenmiş günlük
Genel olmayan ILogger arayüzü (void LogInformation(string message)) ve ILogger<T> : ILogger arayüzü tanımla. ConsoleLogger<T> sınıfı ILogger<T>'yi uygulayıp Console.WriteLine("[INF] " + message) yapsın. Statik LoggerMessage sınıfında DefineInformation(string message) metodu Action<ILogger, string> döndürsün; temsilci ikinci argümanı {Arg} yer tutucusunun yerine koysun. Main'de bir ConsoleLogger<Program> yarat, DefineInformation("Merhaba {Arg}") ile temsilciyi al ve greet(logger, "Ayşe") çağır.
Başlangıç kodu
using System;
// ILogger, ILogger<T>, ConsoleLogger<T> ve static LoggerMessage sınıfını ekle
class Program
{
static void Main()
{
// DefineInformation ile temsilci al ve çağır
}
}Örnek çözüm
using System;
public interface ILogger
{
void LogInformation(string message);
}
public interface ILogger<T> : ILogger { }
public class ConsoleLogger<T> : ILogger<T>
{
public void LogInformation(string message) =>
Console.WriteLine("[INF] " + message);
}
public static class LoggerMessage
{
public static Action<ILogger, string> DefineInformation(string message) =>
(logger, arg) => logger.LogInformation(message.Replace("{Arg}", arg));
}
class Program
{
static void Main()
{
var logger = new ConsoleLogger<Program>();
var greet = LoggerMessage.DefineInformation("Merhaba {Arg}");
greet(logger, "Ayşe");
}
}Beklenen çıktı
[INF] Merhaba Ayşe
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Günlükleme kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
ILogger<T> |
Günlükleme arayüzü |
LogError |
Hata seviyesi |
{User} |
Adlandırılmış yer tutucu |
ConsoleLogger<T> |
Konsol sağlayıcısı |
2 Hata durumları hangi seviyeyle günlüklenir?
- LogDebug
- LogError Doğru cevap
- LogInformation
- LogTrace
Açıklama: LogError hata durumlarını günlükler.