.NET uygulamalarında günlüğe kaydetme ve izleme

Tamamlandı

Uygulamanızı geliştirmeye devam ettikçe ve daha karmaşık hale geldikçe, uygulamanıza ek hata ayıklama tanılamaları uygulamak isteyeceksiniz.

İzleme, uygulamanızın çalışırken yürütülmesini izlemenin bir yoludur. .NET uygulamanızı geliştirirken izleme ve hata ayıklama araçları ekleyebilirsiniz. Uygulamayı geliştirirken ve dağıttıktan sonra bu araçları kullanabilirsiniz.

Bu basit teknik şaşırtıcı derecede güçlüdür. Hata ayıklayıcıdan fazlasına ihtiyaç duyduğunuz durumlarda bunu kullanabilirsiniz:

  • Uzun süreler boyunca meydana gelen sorunları geleneksel bir hata ayıklayıcı ile çözmek zor olabilir. Uzun sürelere yayılan ayrıntılı olay sonrası inceleme için günlükler olanak sağlar. Buna karşılık, hata ayıklayıcıları gerçek zamanlı analizle kısıtlanır.
  • Çok iş parçacıklı uygulamalar ve dağıtılmış uygulamaların hata ayıklaması genellikle zordur. Hata ayıklayıcı eklemek davranışları değiştirme eğilimindedir. Karmaşık sistemleri anlamak için gereken ayrıntılı günlükleri analiz edebilirsiniz.
  • Dağıtılmış uygulamalardaki sorunlar, birçok bileşen arasındaki karmaşık etkileşimden kaynaklanabilir. Hata ayıklayıcıyı sistemin her bölümüne bağlamak mantıklı olmayabilir.
  • Birçok hizmet durdurulmamalıdır. Hata ayıklayıcı eklemek genellikle zaman aşımı hatalarına neden olur.
  • Sorunlar her zaman öngörülemez. Günlüğe kaydetme ve izleme, bir sorun oluşması durumunda programların her zaman kayıt yapabilmesi için düşük sistem yükü oluşturacak şekilde tasarlanmıştır.

Çıkış pencerelerine bilgi yazma

Bu noktaya kadar, uygulama kullanıcısına bilgi görüntülemek için konsolunu kullandık. .NET ile oluşturulan mobil, web ve masaüstü uygulamaları gibi kullanıcı arabirimlerine sahip başka uygulama türleri vardır ve görünür bir konsol yoktur. Bu uygulamalarda, System.Console iletilerin kayıtlarını arka planda tutar. Bu iletiler Visual Studio veya Visual Studio Code'daki bir çıkış penceresinde görünebilir. Bunlar, ayrıca Android'in logcatgibi bir sistem günlüğüne gönderilebilir. Sonuç olarak, konsol dışı bir uygulamada System.Console.WriteLine kullanırken dikkate almanız gerekir.

System.Diagnostics.Debugek olarak System.Diagnostics.Trace ve System.Console kullanabileceğiniz yerdir. Hem Debug hem de Trace, System.Diagnostics'nin bir parçasıdır ve yalnızca uygun bir dinleyici eklendiğinde günlüklere yazar.

Hangi yazdırma stili API'sinin kullanılacağı size kalmış. Önemli farklar şunlardır:

  • System.Console
    • Her zaman etkindir ve her zaman konsola yazar.
    • Müşterinizin yayında görmesi gerekebilecek bilgiler için kullanışlıdır.
    • En basit yaklaşım olduğundan, genellikle geçici geçici hata ayıklama için kullanılır. Bu hata ayıklama kodu genellikle kaynak denetime eklenmez.
  • System.Diagnostics.Trace
    • Yalnızca TRACE tanımlandığında etkinleştirilir.
    • Varsayılan olarak, DefaultTraceListener ekli Dinleyicilere yazar.
    • Çoğu derlemede etkinleştirilecek günlükleri oluştururken bu API'yi kullanın.
  • System.Diagnostics.Debug
    • Yalnızca DEBUG tanımlandığında (hata ayıklama modundayken) etkinleştirilir.
    • Bağlı hata ayıklayıcıya yazar.
    • Yalnızca hata ayıklama derlemelerinde etkinleştirilecek günlükler oluştururken bu API'yi kullanın.
Console.WriteLine("This message is readable by the end user.");
Trace.WriteLine("This is a trace message when tracing the app.");
Debug.WriteLine("This is a debug message just for developers.");

İzleme ve hata ayıklama stratejinizi tasarlarken çıkışın nasıl görünmesini istediğinizi düşünün. İlişkisiz bilgilerle doldurulmuş birden çok Write deyimi, okunması zor bir kayıt oluşturur. Öte yandan, ilişkili deyimleri ayrı satırlara yerleştirmek için WriteLine kullanmak, hangi bilgilerin birbirine ait olduğunu ayırt etmek zor olabilir. Genel olarak, tek bir bilgilendirici ileti oluşturmak için birden çok kaynaktan gelen bilgileri birleştirmek istediğinizde birden çok Write ifadeleri kullanın. Tek bir tam ileti oluşturmak istediğinizde WriteLine deyimini kullanın.

Debug.Write("Debug - ");
Debug.WriteLine("This is a full line.");
Debug.WriteLine("This is another full line.");

Önce yapılan günlük kaydıyla elde edilen bu sonuç Debugiçerir:

Debug - This is a full line.
This is another full line.

TRACE ve DEBUG sabitlerini tanımlama

Varsayılan olarak, bir uygulama hata ayıklama altında çalışırken DEBUG sabiti tanımlanır. Bunu, özellik grubundaki proje dosyasına bir DefineConstants girişi ekleyerek denetleyebilirsiniz. TRACE yapılandırmaları için Debug'e ek olarak, hem Release hem de DEBUG yapılandırmaları için Debug açma örneği burada verilmiştir.

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DefineConstants>TRACE</DefineConstants>
</PropertyGroup>

hata ayıklayıcıya bağlı değilken Trace kullandığınızda, dotnet-tracegibi bir izleme dinleyicisi yapılandırmanız gerekir.

Koşullu izleme

Basit Write ve WriteLine yöntemlerine ek olarak, WriteIf ve WriteLineIfile koşul ekleme özelliği de vardır. Örneğin, aşağıdaki mantık sayıyı sıfır olup olmadığını denetler ve ardından bir hata ayıklama iletisi yazar:

if(count == 0)
{
    Debug.WriteLine("The count is 0 and this may cause an exception.");
}

Bunu tek bir kod satırında yeniden yazabilirsiniz:

Debug.WriteLineIf(count == 0, "The count is 0 and this may cause an exception.");

Bu koşulları Trace ve uygulamanızda tanımladığınız bayraklarla da kullanabilirsiniz:

bool errorFlag = false;  
System.Diagnostics.Trace.WriteIf(errorFlag, "Error in AppendData procedure.");  
System.Diagnostics.Debug.WriteIf(errorFlag, "Transaction abandoned.");  
System.Diagnostics.Trace.Write("Invalid value for data request");

Belirli koşulların mevcut olduğunu doğrulayın

Doğrulama veya Assert deyimi, Assert deyimine bağımsız değişken olarak belirttiğiniz bir koşulu sınar. Koşul trueolarak değerlendirilirse hiçbir eylem gerçekleşmez. Koşul falseolarak değerlendirilirse onay başarısız olur. Hata ayıklama derlemesi ile çalıştırıyorsanız, programınız kesme moduna girer.

Assert yöntemini, Debug ad alanında bulunan Trace veya System.Diagnostics'den kullanabilirsiniz. Debug sınıf yöntemleri programınızın yayın sürümüne dahil değildir, bu nedenle yayın kodunuzun boyutunu artırmaz veya hızını azaltmaz.

Kodunuz doğruysa doğru olması gereken koşulları test etmek için System.Diagnostics.Debug.Assert yöntemini serbestçe kullanın. Örneğin, bir tamsayı bölme işlevi yazdığınızı varsayalım. Matematik kurallarına göre bölen asla sıfır olamaz. Doğrulama kullanarak, bu koşulu test edebilirsiniz.

int IntegerDivide(int dividend, int divisor)
{
    Debug.Assert(divisor != 0, $"{nameof(divisor)} is 0 and will cause an exception.");

    return dividend / divisor;
}

Bu kodu hata ayıklayıcısı altında çalıştırdığınızda onay deyimi değerlendirilir. Ancak, karşılaştırma sürüm sürümünde yapılmaz, bu nedenle ek yük yoktur.

Not

System.Diagnostics.Debug.Assertkullandığınızda, Assert kaldırılırsa Assert içindeki kodların programın sonuçlarını değiştirmediğinden emin olun. Aksi takdirde, yanlışlıkla yalnızca programınızın yayın sürümünde görüntülenen bir hataya neden olabilirsiniz. Özellikle işlev veya yordam çağrıları içeren doğrulamalar konusunda dikkatli olun.

Debug ad alanından Trace ve System.Diagnostics kullanmak, uygulamanızı çalıştırırken ve hata ayıklarken ek bağlam sağlamanın harika bir yoludur.