Pengelogan dan pelacakan dalam aplikasi .NET
Saat Anda terus mengembangkan aplikasi dan aplikasi menjadi lebih kompleks, Anda harus menerapkan diagnostik debug tambahan ke aplikasi Anda.
Pelacakan adalah cara bagi Anda untuk memantau eksekusi aplikasi Anda saat sedang berjalan. Anda dapat menambahkan instrumentasi pelacakan dan penelusuran kesalahan ke aplikasi .NET saat mengembangkannya. Anda dapat menggunakan instrumentasi tersebut saat mengembangkan aplikasi dan setelah menyebarkannya.
Teknik sederhana ini mengejutkan kuat. Anda dapat menggunakannya dalam situasi di mana Anda memerlukan lebih dari sekadar alat debug.
- Masalah yang terjadi dalam jangka waktu yang lama dapat sulit di-debug dengan debugger tradisional. Catatan log memungkinkan tinjauan pasca-mortem terperinci yang mencakup jangka waktu yang lama. Sebaliknya, debugger dibatasi untuk analisis real-time.
- Aplikasi multi-utas dan aplikasi terdistribusi sering kali sulit di-debug. Melampirkan debugger cenderung memodifikasi perilaku. Anda dapat menganalisis log terperinci sesuai kebutuhan untuk memahami sistem yang kompleks.
- Masalah dalam aplikasi terdistribusi mungkin muncul dari interaksi kompleks antara banyak komponen. Mungkin tidak masuk akal untuk menghubungkan debugger ke setiap bagian sistem.
- Banyak layanan tidak boleh terhenti. Menggunakan debugger sering menyebabkan kegagalan batas waktu.
- Masalah tidak selalu diperkirakan. Pengelogan dan pelacakan dirancang untuk overhead rendah sehingga program selalu dapat merekam jika terjadi masalah.
Menulis informasi ke jendela output
Hingga saat ini, kami telah menggunakan konsol untuk menampilkan informasi kepada pengguna aplikasi. Ada jenis aplikasi lain yang dibangun dengan .NET yang memiliki antarmuka pengguna, seperti aplikasi seluler, web, dan desktop, dan tidak ada konsol yang terlihat. Dalam aplikasi ini, System.Console mencatat pesan "di belakang layar." Pesan-pesan ini mungkin muncul di jendela output di Visual Studio atau Visual Studio Code. Mereka juga mungkin dikeluarkan ke log sistem seperti log Android logcat. Akibatnya, Anda harus mempertimbangkan dengan baik saat menggunakan System.Console.WriteLine dalam aplikasi non-konsol.
Di sinilah Anda dapat menggunakan System.Diagnostics.Debug dan System.Diagnostics.Trace selain System.Console. Baik Debug maupun Trace adalah bagian dari System.Diagnostics dan hanya akan menulis ke log ketika listener yang sesuai terpasang.
Pilihan API gaya cetak mana yang akan digunakan terserah Anda. Perbedaan utamanya adalah:
-
System.Console
- Selalu diaktifkan dan selalu mencatat ke konsol.
- Berguna untuk informasi yang mungkin perlu dilihat pelanggan Anda dalam rilis.
- Karena ini adalah pendekatan paling sederhana, ini sering digunakan untuk penelusuran kesalahan sementara ad-hoc. Kode debug ini seringkali tidak dimasukkan ke kontrol sumber.
-
System.Diagnostics.Trace
- Hanya diaktifkan saat
TRACEditentukan. - Menulis ke Pendengar terlampir, secara default, yaitu DefaultTraceListener.
- Gunakan API ini saat Anda membuat log yang akan diaktifkan di sebagian besar build.
- Hanya diaktifkan saat
-
System.Diagnostics.Debug
- Hanya diaktifkan saat
DEBUGditentukan (saat dalam mode debug). - Menulis ke debugger yang terhubung.
- Gunakan API ini saat Anda membuat log yang hanya akan diaktifkan dalam build debug.
- Hanya diaktifkan saat
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.");
Saat Anda merancang strategi pelacakan dan penelusuran kesalahan, pikirkan bagaimana Anda ingin output terlihat. Beberapa pernyataan Tulis yang diisi dengan informasi yang tidak terkait membuat log yang sulit dibaca. Di sisi lain, menggunakan WriteLine untuk menempatkan pernyataan terkait pada baris terpisah mungkin membuatnya sulit untuk membedakan informasi mana yang saling berhubungan. Secara umum, gunakan beberapa pernyataan Tulis saat Anda ingin menggabungkan informasi dari beberapa sumber untuk membuat satu pesan informatif. Gunakan pernyataan WriteLine saat Anda ingin membuat satu pesan lengkap.
Debug.Write("Debug - ");
Debug.WriteLine("This is a full line.");
Debug.WriteLine("This is another full line.");
Output ini berasal dari pengelogan sebelumnya dengan Debug:
Debug - This is a full line.
This is another full line.
Menentukan konstanta TRACE dan DEBUG
Secara default, ketika aplikasi berjalan di bawah debug, konstanta DEBUG ditentukan. Anda dapat mengontrol ini dengan menambahkan entri DefineConstants dalam file proyek dalam grup properti. Berikut adalah contoh mengaktifkan TRACE untuk konfigurasi Debug dan Release selain DEBUG untuk konfigurasi Debug.
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DefineConstants>DEBUG;TRACE</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
Saat Anda menggunakan Trace saat tidak dilampirkan ke debugger, Anda harus mengonfigurasi pelacak jejak seperti dotnet-trace.
Pelacakan bersyarat
Selain metode Write dan WriteLine sederhana, ada juga kemampuan untuk menambahkan kondisi dengan WriteIf dan WriteLineIf. Sebagai contoh, logika berikut memeriksa apakah jumlahnya nol lalu menulis pesan debug:
if(count == 0)
{
Debug.WriteLine("The count is 0 and this may cause an exception.");
}
Anda dapat menulis ulang ini dalam satu baris kode:
Debug.WriteLineIf(count == 0, "The count is 0 and this may cause an exception.");
Anda juga dapat menggunakan kondisi ini dengan Trace dan dengan bendera yang Anda tentukan dalam aplikasi Anda:
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");
Verifikasi bahwa kondisi tertentu ada
Pernyataan, atau pernyataan Assert, menguji kondisi yang Anda tentukan sebagai argumen untuk pernyataan Assert. Jika kondisi dievaluasi menjadi true, tidak ada tindakan yang terjadi. Jika kondisi bernilai false, maka pernyataan gagal. Jika Anda sedang menjalankan build debug, program Anda akan memasuki mode jeda.
Anda dapat menggunakan metode Assert dari Debug atau Trace, yang ada di namespace System.Diagnostics.
Debug metode kelas tidak disertakan dalam versi rilis program Anda, sehingga tidak meningkatkan ukuran atau mengurangi kecepatan kode rilis Anda.
Gunakan metode System.Diagnostics.Debug.Assert secara bebas untuk menguji kondisi yang harus bernilai benar jika kode Anda benar. Misalnya, Anda telah menulis fungsi pembagian bilangan bulat. Dengan aturan matematika, pembavisor tidak pernah bisa nol. Anda dapat menguji kondisi ini dengan menggunakan pernyataan:
int IntegerDivide(int dividend, int divisor)
{
Debug.Assert(divisor != 0, $"{nameof(divisor)} is 0 and will cause an exception.");
return dividend / divisor;
}
Saat Anda menjalankan kode ini dalam debugger, pernyataan asersi dievaluasi. Namun, perbandingan tidak dibuat dalam versi rilis, jadi tidak ada overhead tambahan.
Nota
Saat Anda menggunakan System.Diagnostics.Debug.Assert, pastikan bahwa kode apa pun di dalam Assert tidak mengubah hasil program jika Assert dihapus. Jika tidak, Anda mungkin secara tidak sengaja memperkenalkan bug yang hanya muncul dalam versi rilis program Anda. Berhati-hatilah dengan pernyataan yang berisi panggilan fungsi atau prosedur.
Menggunakan Debug dan Trace dari namespace System.Diagnostics adalah cara yang bagus untuk memberikan konteks tambahan saat Anda menjalankan dan men-debug aplikasi Anda.