.NET günlüğü ve izleme

Kod, program çalışırken gerçekleşen ilginç olayları kaydeden bir günlük üretmek amacıyla enstrümante edilebilir. Uygulamanın davranışını anlamak için günlükler gözden geçirilebilir. .NET, tarihsel süreçte birkaç farklı kayıt tutma API'si biriktirmiştir ve bu makale hangi seçeneklerin mevcut olduğunu anlamanıza yardımcı olacaktır.

Not

Günlük kaydı, bazen 'izleme' olarak da adlandırılır; bu adlandırma, eski Windows ve .NET API'lerinin bazılarında da görülüyor. Son yıllarda 'izleme' daha yaygın olarak Dağıtılmış izleme kısaltması olarak kullanılır, ancak bu makalenin anlamı bu değildir.

.NET log API'leri

ILogger

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

ILogger, .NET için OpenTelemetry uygulaması kapsamında günlük kayıt altyapısını sağlar ve daha fazla analiz için uygulamanızdan çeşitli APM sistemlerine günlüklerin dışa aktarılmasını mümkün kılar.

Olay Kaynağı

EventSource, yapılandırılmış günlüğe kaydetme özelliğine sahip eski ve yüksek performanslı bir API'dir. Başlangıçta Windows için Olay İzleme (ETW) ile iyi tümleştirilmek üzere tasarlanmıştır, ancak daha sonra çapraz platform izleme için EventPipe ve özelleştirilmiş EventListener sinkler için genişletilmiştir. ILogger ile karşılaştırıldığında, EventSource'nin nispeten az sayıda önceden tanımlanmış log havuzu vardır ve ayrı yapılandırma dosyaları üzerinden yapılandırmaya yönelik yerleşik desteği yoktur. EventSource ETW veya EventPipe tümleştirmesi üzerinde daha sıkı denetim istiyorsanız mükemmeldir, ancak genel amaçlı günlük kaydı için ILogger daha esnektir ve kullanımı daha kolaydır.

İzleme

System.Diagnostics.Trace ve System.Diagnostics.Debug, .NET'in en eski günlük API'leridir. Bu sınıfların esnek yapılandırma API'leri ve büyük bir sink ekosistemi vardır, ancak yalnızca yapılandırılmamış loglamayı 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. Henüz bir günlük API'sine taahhütte bulunmamış daha yeni uygulamalar için ILogger daha iyi işlevsellik sunabilir.

Özelleştirilmiş log API'leri

Konsol

System.Console sınıfı, basit günlük senaryolarında kullanılabilecek Write ve WriteLine yöntemlerine sahiptir. Bu API ile başlamak çok kolaydır, ancak çözüm genel amaçlı günlüğe kaydetme API'si kadar esnek bir yapıya sahip olmayacaktır. Konsol yalnızca yapılandırılmamış kayıt yapılmasına izin verir ve etkinleştirilecek günlük iletilerini seçmek veya farklı bir kanala hedeflemek için yapılandırma desteği yoktur. ILogger veya Trace API'lerini konsol çıkışıyla kullanmak çok fazla çaba gerektirmez ve günlük tutmayı yapılandırılabilir durumda tutar.

DiagnosticSource

System.Diagnostics.DiagnosticSource günlük iletilerinin herhangi bir depolama alanına serileştirilmesi yerine senkron olarak işlem içinde analiz edildiği günlüğe kaydetme amacı taşır. 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.

Günlük terminolojisi

Yapılandırılmış ve yapılandırılmamış günlük kaydı

Loglama yapılandırılmış veya yapılandırılmamış olabilir.

  • Yapılandırılmamış: Günlük girdileri, insanların okuyabileceği serbest biçimli metin olarak kodlanır, ancak program aracılığıyla ayrıştırmak ve sorgulamak zordur.
  • 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.

İyi yapılandırılmış günlükleme API'leri, kullanım karmaşıklığında sadece biraz artışla daha fazla işlevsellik ve performans sunabilir.

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.