Structured logging
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
-
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
-
Yapılandırılmış iletiyi tamamla
logger.LogInformation("Kullanıcı ____ giriş yaptı", user);Cevabı göster
logger.LogInformation("Kullanıcı {User} giriş yaptı", user); -
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.