ASP.NET Core 6 kullanılarak oluşturulan uygulamalar üzerinde çalışırken, uygulamanızın performansını izlemek ve hataları tanılamak için genellikle izleme ve günlüğe kaydetmeyi kullanmak isteyebilirsiniz. Uygulamanızın çalışma zamanında nasıl performans gösterdiğini ölçmek için üretim ortamında izlemeyi de kullanabilirsiniz.
Bu makalede, ASP.NET Core 6’da izlemeyi nasıl kullanabileceğimiz tartışılmaktadır. İzleme iletilerini toplamak ve izleme çıktısını ILogger kullanarak bir olay günlüğüne yönlendirmek için izleme dinleyicilerinin nasıl kullanılacağını inceleyeceğiz.
Bu makalede verilen kod örnekleri ile çalışmak için sisteminizde Visual Studio 2022 kurulu olmalıdır. Halihazırda bir kopyanız yoksa, Visual Studio 2022’yi buradan indirin.
Visual Studio 2022’de bir ASP.NET Core Web API projesi oluşturun
Öncelikle Visual Studio 2022’de bir ASP.NET Core projesi oluşturalım. Aşağıdaki adımları takiben Visual Studio 2022’de yeni bir ASP.NET Core 6 Web API projesi oluşturacağız:
- Visual Studio 2022 IDE’yi başlatın.
- “Yeni proje oluştur” u tıklayın.
- “Yeni proje oluştur” penceresinde, görüntülenen şablonlar listesinden “ASP.NET Core Web API” seçeneğini seçin.
- Sonrakine tıkla.
- “Yeni projenizi yapılandırın” penceresinde yeni proje için ad ve konum belirleyin.
- İsteğe bağlı olarak, tercihlerinize bağlı olarak “Çözüm ve projeyi aynı dizine yerleştir” onay kutusunu işaretleyin.
- Sonrakine tıkla.
- Aşağıda gösterilen “Ek Bilgiler” penceresinde, bu örnekte minimum API kullanmayacağımız için “Denetleyicileri kullan…” yazan onay kutusunun işaretli olduğundan emin olun. “Kimlik Doğrulama Türü”nü “Yok” (varsayılan) olarak bırakın.
- Bu özelliklerin hiçbirini burada kullanmayacağımız için “Docker’ı Etkinleştir”, “HTTPS için Yapılandır” ve “Açık API Desteğini Etkinleştir” onay kutularının işaretli olmadığından emin olun.
- Oluştur’u tıklayın.
Bu makalenin sonraki bölümlerinde izleme dinleyicileriyle çalışmak için bu ASP.NET Core 6 Web API projesini kullanacağız.
izleme nedir?
Önemli olayları izleyen olay günlüğü ile karşılaştırıldığında, izleme, çalışan uygulamanın ve bileşenlerinin çok daha eksiksiz bir görünümünü sağlar. Günlükler, uygulamanızda meydana gelen olayların kaydını gösteren yapılandırılmış veya yapılandırılmamış zaman damgalı verilerden oluşur. İzleme, bireysel istek ve nasıl işlendiği konusunda çok daha fazla görünürlük sağlar.
System.Diagnostics ad alanı, Trace ve Debug sınıflarını içerir. Üretim ortamlarında Trace sınıfı kullanılırken geliştirme zamanında Debug sınıfı kullanılır.
İzleme tipik olarak aşağıdaki üç aşamayı içerir:
- Enstrümantasyon: İlgili bilgileri yakalamak için gerekli kodu yazıyoruz
- İzleme: İzleme mesajlarını belirli bir hedefe, yani bir olay günlüğüne, bir metin dosyasına, bir veritabanı tablosuna vb. yazarız.
- Analiz: Uygulamadaki darboğazları belirlemek için izlerden toplanan bilgileri analiz ederiz.
İz dinleyiciler nelerdir? Neden ihtiyaç duyuyorlar?
İzleme dinleyicileri izleme mesajlarını toplar, saklar ve metin dosyası gibi uygun bir hedefe yönlendirir. .NET, aşağıdakiler dahil olmak üzere çeşitli izleme dinleyicileri sağlar:
- ConsoleTraceListener – konsol penceresine izleme mesajları gönderir.
- DefaultTraceListener – izleme mesajlarını standart hata ayıklama çıktısına gönderir.
- DelimitedListTraceListener – izleme çıktısını bir akışa, akış yazıcısına veya metin yazarına sınırlandırılmış bir biçimde gönderir.
- EventLogTraceListener – olay günlüklerine izleme mesajları gönderir.
- TextWriterTraceListener – izleme mesajlarını bir metin dosyasına gönderir.
- XmlWriterTraceListener – izleme mesajlarını XML’e dönüştürür.
System.Diagnostics.Debug ve System.Diagnostics.Trace sınıfları, izleme dinleyicilerine mesajlar gönderebilir, bu da mesajları uygun bir hedefe yönlendirir.
ASP.NET Core 6’da bir yapılandırma dosyası kullanarak bir izleme dinleyicisi oluşturun
Bir yapılandırma dosyası kullanarak veya özel kod yazarak bir izleme dinleyicisi oluşturabilirsiniz. Aşağıda gösterilen kod parçacığı, uygulama yapılandırma dosyanızı kullanarak bir izleme dinleyicisinin nasıl oluşturulacağını gösterir.
<configuration>
<system.diagnostics>
<trace autoflush="false" indentsize="4">
<listeners>
<add name="MyFirstListener"
type="System.Diagnostics.TextWriterTraceListener"
initializeData="TraceOutput.txt" />
<remove name="Default" />
</listeners>
</trace>
</system.diagnostics>
</configuration>
Listeners koleksiyonuna eklenen tüm dinleyiciler, izleme çıktısı alacaktır. Ancak, bir dinleyici kullanabilirsiniz olmadan Listeners koleksiyonuna ekleyerek. Bu durumda, dinleyici içinde Write veya WriteLine yöntemini kullanarak çıktı gönderirsiniz.
Aşağıdaki kod, Listeners koleksiyonuna eklenmemiş ancak yine de bir çıktı penceresine, bir dosyaya veya önceden yapılandırılmış herhangi bir çıktıya izleme iletileri gönderebilen bir dinleyiciyi gösterir.
TextWriterTraceListener myFirstListener = new
TextWriterTraceListener("Output.txt", "myFirstListener");
myFirstListener.WriteLine("This is a test message.");
myFirstListener.Flush();
ASP.NET Core 6’da özel bir izleme dinleyicisi oluşturun
Varsayılan olarak .NET 6 ile gelen izleme dinleyicileri çoğu durumda gereksinimlerinizi karşılayacaktır. Ancak, izleme mesajlarınızı farklı bir hedefe göndermek istiyorsanız, kendi izleme dinleyicinizi uygulayabilirsiniz.
Özel bir izleme dinleyicisi oluşturmak için TraceListener soyut sınıfını genişleten bir sınıf oluşturmalısınız. TraceListener sınıfında birkaç sanal ve soyut yöntem vardır. En azından Write ve WriteLine yöntemlerini uygulamalısınız. En azından, özel izleme dinleyiciniz şöyle görünmelidir:
public class CustomTraceListener : TraceListener
{
public CustomTraceListener(ILoggerFactory loggerFactory)
{
}
public override void Write(string? message, string? category)
{
}
public override void Write(string? message)
{
}
public override void WriteLine(string? message)
{
}
}
Bu nedenle, özel izleme dinleyici sınıfınız bir bağımsız değişken oluşturucuya ve Write ve WriteLine yöntemlerine sahip olmalıdır.
Günlük hedefine gönderilmeden önce günlükçüsünü temsil eden bir ILogger örneğine, günlükçü oluşturmak için bir günlükçü fabrikasına ve izleme mesajlarını depolamak için bir StringBuilder’a da ihtiyacınız olacaktır.
private readonly ILoggerFactory _loggerFactory;
private readonly ILogger _iLogger;
private readonly StringBuilder _stringBuilder = new();
Yapıcıya bir ILoggerFactory örneğini enjekte etmek için bağımlılık enjeksiyonundan yararlanabilir ve ardından örneği bir ILogger örneği oluşturmak için kullanabilirsiniz.
public CustomTraceListener(ILoggerFactory loggerFactory)
{
_loggerFactory = loggerFactory;
_iLogger = loggerFactory.CreateLogger(nameof(CustomTraceListener));
}
İşte Write ve WriteLine yöntemlerinin minimal bir uygulaması:
public override void Write(string? message, string? category)
{
_stringBuilder.Append(message + "-" + category);
}
public override void Write(string? message)
{
_stringBuilder.Append(message);
}
public override void WriteLine(string? message)
{
_stringBuilder.AppendLine(message);
_iLogger.LogInformation(_stringBuilder.ToString());
_stringBuilder.Clear();
}
ASP.NET Core 6’da eksiksiz özel izleme dinleyicisi örneği
Aşağıda, referansınız için minimum düzeyde özel izleme dinleyici uygulamamızın tam kaynak kodu bulunmaktadır.
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Text;
namespace TraceListenerDemo
{
public class CustomTraceListener : TraceListener
{
private readonly ILoggerFactory _loggerFactory;
private readonly ILogger _iLogger;
private readonly StringBuilder _stringBuilder = new();
public CustomTraceListener(ILoggerFactory loggerFactory)
{
_loggerFactory = loggerFactory;
_iLogger =
loggerFactory.CreateLogger(nameof(CustomTraceListener));
}
public override void Write(string? message, string? category)
{
_stringBuilder.Append(message + "-" + category);
}
public override void Write(string? message)
{
_stringBuilder.Append(message);
}
public override void WriteLine(string? message)
{
_stringBuilder.AppendLine(message);
_iLogger.LogInformation(_stringBuilder.ToString());
_stringBuilder.Clear();
}
}
}
Özel izleme dinleyicisini Program.cs dosyasına kaydedin
Özel izleme dinleyicisini kullanmak için, aşağıdaki kodu kullanarak onu Listeners koleksiyonuna kaydettirmelisiniz.
var loggerFactory = app.Services.GetRequiredService<ILoggerFactory>();
Trace.Listeners.Add(new LoggerTraceListener(loggerFactory));
Özel izleme dinleyicimiz dinleyici koleksiyonuna eklendiğinden, çalışma zamanı tarafından oluşturulan tüm izleme mesajlarını yakalayacak ve çıktıyı günlükçümüze gönderecektir. Ayrıca uygulamada açıkça gönderdiğimiz izleme mesajlarını da gönderir (daha önce myFirstListener örneğinde yaptığımız gibi).
Böylece, Listeners koleksiyonuna eklenen herhangi bir dinleyici, uygulamada açıkça gönderilen izleme mesajlarının yanı sıra çalışma zamanı tarafından oluşturulan izlemeleri de yakalayabilir. Ancak, koleksiyona bir izleme dinleyicisi eklenmemişse, yalnızca uygulamada açıkça gönderilen izleme mesajlarını gönderebilir. Çalışma zamanı tarafından oluşturulan hiçbir izleme mesajını yakalamaz.
Özel izleme dinleyicileriyle çalışırken, çıktı arabelleğinin boşaltıldığından emin olmak için izleme dinleyicisini kapatmayı veya temizlemeyi unutmamalısınız. StringBuilder kullanan kodunuzu (CustomTraceListener sınıfında) optimize etmek için StringBuilderCache sınıfından yararlanabilirsiniz.
Telif Hakkı © 2022 IDG Communications, Inc.
Kaynak : https://www.infoworld.com/article/3664060/how-to-work-with-trace-listeners-in-aspnet-core-6.html#tk.rss_all