CodeBlanks Logo Icon CodeBlanks

Structured logging

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

Structured logging ve yer tutucuları öğrenirsin.

Structured logging

Yapılandırılmış günlükleme, iletiyi düz dize olarak değil, adlandırılmış yer tutucularla yazar: logger.LogInformation("Kullanıcı {User} giriş yaptı", user). Yer tutucular günlükçü tarafından ayrıştırılır; değerler alan olarak saklanır.

Avantaj: günlük toplayıcıları (Serilog, Elasticsearch) alanları sorgulanabilir hale getirir. "User=Ayşe" olan tüm olayları aramak kolaydır. Düz dize olsa, yalnızca tam metin arama çalışırdı. Yer tutucu adları anlamlı ve tutarlı seçilmelidir.

Yer tutucu söz dizimi

Yer tutucu {Ad} biçimindedir; ad büyük harfle başlar (PascalCase). Değerler sırayla bağlanır: LogInformation("{User} {Action}", user, action). Burada {User} ilk argümanı, {Action} ikincisini alır.

Dikkat: $"Kullanıcı {user}" ile LogInformation("Kullanıcı {User}", user) farklıdır. Birincisi dizeyi önceden biçimler (yapı kaybolur), ikincisi şablonu günlükçüye iletir. Yapılandırılmış günlükleme için şablonu ayrı tut.

Uygulama Yapılandırılmış günlükleme uygula

Bir ILogger<T> arayüzü tanımla; void LogInformation(string message, params object[] args) metodu olsun. ConsoleLogger<T> sınıfı bu arayüzü uygulayıp her {...} yer tutucusunu sıradaki argümanla değiştirip Console.WriteLine("[INF] " + message) yapsın. Main'de bir ConsoleLogger<Program> yarat ve LogInformation("Kullanıcı {User} {Action} yaptı", "Ayşe", "giriş") çağrısı yap.

Ö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. Main'de: var l = new ConsoleLogger<Program>(); l.LogInformation("Kullanıcı {User} {Action} yaptı", "Ayşe", "giriş");
Ö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 Program
{
    static void Main()
    {
        var logger = new ConsoleLogger<Program>();
        logger.LogInformation("Kullanıcı {User} {Action} yaptı", "Ayşe", "giriş");
    }
}

Kendini test et

  1. Yapılandırılmış günlük terimlerini eşleştir

    {User}
    Adlandırılmış yer tutucu
    params object[] args
    Yer tutucu değerleri
    message template
    Yer tutucuları içeren dize
    field
    Sorgulanabilir alan
  2. Yapılandırılmış iletiyi tamamla

    logger.LogInformation("Kullanıcı ____ giriş yaptı", user);
    Cevabı göster
    logger.LogInformation("Kullanıcı {User} giriş yaptı", user);
  3. Yapılandırılmış günlüklemenin başlıca kazancı nedir?

    • Daha az bellek kullanımı
    • Alanları sorgulanabilir yapmak
    • Daha renkli çıktı
    • Daha kısa kod
    Cevabı göster

    Alanları sorgulanabilir yapmak — Doğru. Adlandırılmış yer tutucular değerleri sorgulanabilir alanlara dönüştürür.

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