CodeBlanks Logo Icon CodeBlanks

Özet - Günlükleme

C# kursu · İleri seviye · Ders 78/83

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.

Örnek çözümü göster
interface ILogger<T> { void LogInformation(string message, params object[] args); } tanımla. 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); } } yaz. class UserService { private readonly ILogger<UserService> _logger; public UserService(ILogger<UserService> l) => _logger = l; public void Greet(string user) => _logger.LogInformation("Merhaba {User}", user); } yaz. Main'de: var svc = new UserService(new ConsoleLogger<UserService>()); svc.Greet("Ayşe");
Ö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");
    }
}

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.

Örnek çözümü göster
interface ILogger { void LogInformation(string message); } ve interface ILogger<T> : ILogger { } tanımla. class ConsoleLogger<T> : ILogger<T> { public void LogInformation(string message) => Console.WriteLine("[INF] " + message); } yaz. static class LoggerMessage { public static Action<ILogger, string> DefineInformation(string message) => (logger, arg) => logger.LogInformation(message.Replace("{Arg}", arg)); } yaz. Main'de: var logger = new ConsoleLogger<Program>(); var greet = LoggerMessage.DefineInformation("Merhaba {Arg}"); greet(logger, "Ayşe");
Ö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");
    }
}

Kendini test et

  1. Günlükleme kavramlarını eşleştir

    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
    • LogInformation
    • LogError
    • LogTrace
    Cevabı göster

    LogError — Doğru. LogError hata durumlarını günlükler.

İleri seviye bölümündeki tüm dersler