.NET günlüğü ve izleme

Kod, program çalışırken gerçekleşen ilginç olayların kaydı olarak görev yapan bir günlük oluşturmak için izlenebilir. Uygulamanın davranışını anlamak için günlükler gözden geçirilebilir. Günlüğe kaydetme ve izleme bu tekniği kapsüller. .NET, geçmişi üzerinde birkaç farklı günlük API'si biriktirmiştir ve bu makale hangi seçeneklerin kullanılabilir olduğunu anlamanıza yardımcı olacaktır.

"Günlüğe kaydetme" ve "izleme" terimleri genellikle eş anlamlıdır. Ayrım, günlük çıkışının her zaman toplanmasının beklendiği ve bu nedenle düşük ek yüke sahip olması gerektiğidir. İzleme genellikle daha invazivdir ve uygulamanın ve .NET çalışma zamanının daha derin bölümlerinden daha fazla bilgi toplar. Belirli sorunları tanılarken veya daha derin performans analizi sistemlerinin bir parçası olarak kısa süreler için otomatik olarak kullanılır.

İzleme terimindeki bir diğer özet de Dağıtılmış izlemedir. Dağıtılmış izleme, istek tabanlı sistemler için üst düzey etkinlik ve zamanlama verilerini toplar ve istekleri hizmetler arasında ilişkilendirerek her isteğin tam sistem tarafından nasıl işlendiğine ilişkin bir görünüm sağlar.

Günlük API'lerinde önemli farklar

Yapılandırılmış günlüğe kaydetme

Günlük API'leri yapılandırılmış veya yapılandırılmamış olabilir:

  • Yapılandırılmamış: Günlük girdileri, insanlar tarafından görüntülenmesi amaçlanan serbest biçimli metin içeriğine sahiptir.
  • Yapılandırılmış: Günlük girdileri iyi tanımlanmış bir şemaya sahiptir ve farklı ikili ve metin biçimlerinde kodlanabilir. Bu günlükler, hem insanların hem de otomatik sistemlerin onlarla kolayca çalışabilmesi için makine çevrilebilir ve sorgulanabilir olacak şekilde tasarlanmıştır.

Yapılandırılmış günlüğü destekleyen API'ler, önemsiz olmayan kullanımlar için tercih edilir. Kullanılabilirlik açısından çok az farkla daha fazla işlevsellik, esneklik ve performans sunar.

Yapılandırma

Basit kullanım örnekleri için, doğrudan konsola veya dosyaya ileti yazan API'leri kullanmak isteyebilirsiniz. Ancak çoğu yazılım projesi, hangi günlük olaylarının kaydedileceğini ve bunların nasıl kalıcı hale getirileceğini yapılandırmayı yararlı bulur. Örneğin, yerel geliştirme ortamında çalışırken kolay okunabilirlik için konsola düz metin çıkışı yapmak isteyebilirsiniz. Daha sonra uygulama bir üretim ortamına dağıtıldığında günlüklerin ayrılmış bir veritabanında veya bir dizi sıralı dosyada depolanmasına geçebilirsiniz. İyi yapılandırma seçeneklerine sahip API'ler bu geçişleri kolaylaştırırken, daha az yapılandırılabilir seçenekler değişiklik yapmak için izleme kodunun her yerde güncelleştirilmesini gerektirir.

Lavabo

Günlük API'lerinin çoğu günlük iletilerinin havuz olarak adlandırılan farklı hedeflere gönderilmesine izin verir. Bazı API'ler çok sayıda önceden hazırlanmış havuza sahipken, bazılarının yalnızca birkaçı vardır. Önceden oluşturulmuş havuz yoksa, genellikle özel bir havuz yazmanıza olanak sağlayan bir genişletilebilirlik API'si vardır, ancak bu işlem biraz daha fazla kod yazmayı gerektirir.

.NET günlük API'leri

ILogger

Mevcut bir projeye günlük ekleme veya yeni proje oluşturma gibi çoğu durumda ILogger altyapısı iyi bir varsayılan seçenektir. ILoggerhızlı yapılandırılmış günlüğü, esnek yapılandırmayı ve bir ASP.NET uygulamasını çalıştırırken gördüğünüz konsol dahil olmak üzere ortak havuz koleksiyonunu destekler. Ayrıca, ILogger arabirim, zengin işlevsellik ve genişletilebilirlik sunan birçok üçüncü taraf günlük uygulaması üzerinde bir cephe işlevi de görebilir.

ILogger, .NET için OpenTelemetry uygulaması için günlük hikayesini sağlar ve daha fazla analiz için uygulamanızdan çeşitli APM sistemlerine günlüklerin çıkışını sağlar.

EventSource

EventSource , yapılandırılmış günlüğe kaydetme özelliğine sahip eski ve yüksek performanslı bir izleme API'sidir. Başlangıçta Windows için Olay İzleme (ETW) ile iyi tümleştirmek üzere tasarlanmıştır, ancak daha sonra EventPipe platformlar arası izlemeyi ve EventListener özel havuzları destekleyecek şekilde genişletilmiştir. ile EventSource karşılaştırıldığındaILogger, nispeten az önceden hazırlanmış günlük havuzu vardır ve ayrı yapılandırma dosyaları aracılığıyla yapılandırmaya yönelik yerleşik destek yoktur. EventSourceETW veya EventPipe tümleştirmesi üzerinde daha sıkı denetim istiyorsanız mükemmeldir, ancak genel amaçlı günlük kaydı ILogger için daha esnektir ve kullanımı daha kolaydır.

İzleme

System.Diagnostics.Trace ve System.Diagnostics.Debug şeklindedir. NET'in en eski günlük API'leri. Bu sınıfların esnek yapılandırma API'leri ve büyük bir havuz ekosistemi vardır, ancak yalnızca yapılandırılmamış günlüğe kaydetmeyi destekler. .NET Framework'te bir app.config dosyası aracılığıyla yapılandırılabilirler, ancak .NET Core'da yerleşik, dosya tabanlı yapılandırma mekanizması yoktur. Bunlar genellikle hata ayıklayıcı altında çalışırken geliştirici için tanılama çıktısı üretmek için kullanılır. .NET ekibi geriye dönük uyumluluk amacıyla bu API'leri desteklemeye devam eder, ancak yeni işlevsellik eklenmez. Bu API'ler, zaten bunları kullanan uygulamalar için iyi bir seçimdir. Daha önce bir günlük API'sine ILogger taahhütte bulunulmayan daha yeni uygulamalar için daha iyi işlevsellik sunabilir.

Özelleştirilmiş günlük API'leri

Konsol

sınıfı, System.Console basit günlük senaryolarında kullanılabilecek ve WriteLine yöntemlerine sahiptirWrite. Bu API'leri kullanmaya başlamak çok kolaydır, ancak çözüm genel amaçlı günlük API'si kadar esnek olmayacaktır. Konsol yalnızca yapılandırılmamış günlüğe kaydetmeye izin verir ve hangi günlük iletilerinin etkinleştirildiğini seçmek veya farklı bir havuza yeniden hedeflemek için yapılandırma desteği yoktur. ILogger veya İzleme API'lerini konsol havuzuyla kullanmak çok fazla çaba harcamaz ve günlüğü yapılandırılabilir durumda tutar.

DiagnosticSource

System.Diagnostics.DiagnosticSource günlük iletilerinin herhangi bir depolama alanına seri hale getirmek yerine zaman uyumlu bir şekilde işlem içinde çözümlendiği günlüğe kaydetmeye yöneliktir. Bu, kaynak ve dinleyicinin rastgele .NET nesnelerini ileti olarak değiştirmesine olanak tanırken, günlük API'lerinin çoğu günlük olayının serileştirilebilir olmasını gerektirir. Bu teknik son derece hızlı olabilir ve dinleyici verimli bir şekilde uygulandığında günlük olaylarını onlarca nanosaniyede işleyebilir. Api burada herhangi bir kısıtlama getirmese de, bu API'leri kullanan araçlar genellikle işlem içi profil oluşturucular gibi davranır.

EventLog

System.Diagnostics.EventLog yalnızca Windows EventLog'a ileti yazan bir Windows API'dir. Çoğu durumda, Windows üzerinde çalışırken ILogger'ı isteğe bağlı bir EventLog havuzuyla kullanmak, uygulamayı Windows işletim sistemine sıkı bir şekilde bağlamadan benzer işlevler verebilir.