Saya telah membaca banyak tentang pelacakan dan penebangan, mencoba menemukan aturan emas untuk praktik terbaik dalam masalah ini, tetapi tidak ada. Orang mengatakan bahwa programmer yang baik menghasilkan penelusuran yang baik, tetapi begitulah dan harus berasal dari pengalaman.
Saya juga membaca pertanyaan serupa di sini dan melalui internet dan mereka tidak benar-benar sama dengan yang saya tanyakan atau tidak memiliki jawaban yang memuaskan, mungkin karena pertanyaannya kurang detail.
Jadi, orang mengatakan bahwa penelusuran harus semacam meniru pengalaman debug aplikasi jika Anda tidak dapat melampirkan debugger. Ini harus menyediakan konteks yang cukup sehingga Anda dapat melihat jalur mana yang diambil pada setiap titik kontrol dalam aplikasi.
Lebih dalam lagi, Anda bahkan dapat membedakan antara tracing dan logging event, dalam "event logging berbeda dari tracing karena ia menangkap status utama daripada aliran kontrol yang terperinci".
Sekarang, katakan saya ingin melakukan penelusuran dan pencatatan menggunakan hanya kelas .NET standar, yang ada di System.Diagnostics
namespace. Saya pikir bahwa kelas TraceSource lebih baik untuk pekerjaan daripada kelas Trace statis, karena saya ingin membedakan antara tingkat jejak dan menggunakan kelas TraceSource saya bisa mengirimkan parameter menginformasikan jenis acara, saat menggunakan kelas Trace saya harus menggunakan Trace.WriteLineIf
dan kemudian verifikasi hal-hal seperti SourceSwitch.TraceInformation
dan SourceSwitch.TraceErrors
, dan bahkan tidak memiliki properti seperti TraceVerbose
atau TraceStart
.
Dengan semua itu dalam pikiran, apakah Anda mempertimbangkan praktik yang baik untuk dilakukan sebagai berikut:
- Lacak peristiwa "Mulai" ketika memulai metode, yang harus mewakili operasi logis tunggal atau pipa, bersama dengan representasi string dari nilai parameter yang diteruskan ke metode.
- Lacak peristiwa "Informasi" saat memasukkan item ke dalam basis data.
- Lacak kejadian "Informasi" saat mengambil satu jalur atau lainnya dalam pernyataan if / else penting.
- Lacak "Kritis" atau "Kesalahan" di blok tangkap tergantung pada apakah itu kesalahan yang dapat dipulihkan.
- Lacak acara "Stop" saat menyelesaikan eksekusi metode.
Dan juga, mohon klarifikasi kapan sebaiknya melacak jenis acara Verbose dan Peringatan. Jika Anda memiliki contoh kode dengan jejak / pencatatan yang bagus dan bersedia untuk berbagi, itu akan sangat baik.
Catatan: Saya telah menemukan beberapa informasi yang baik di sini, tetapi masih belum apa yang saya cari: http://msdn.microsoft.com/en-us/magazine/ff714589.aspx
Jawaban:
Pentingnya jenis jejak harus dipilih bukan karena di mana jejak berada dalam kode, tetapi karena pesan yang dilacak lebih atau kurang penting. Contoh:
Gunakan tipe mulai ketika Anda memulai operasi logis. Ini tidak berarti bahwa jejak awal harus di awal metode, juga tidak berarti bahwa metode harus memiliki jejak awal.
Ini dikatakan, dalam banyak kasus, operasi logis sebenarnya akan dimulai pada awal metode. Jika tidak, Anda harus bertanya pada diri sendiri apakah kode tersebut direaktor ulang dengan benar.
Menelusuri parameter mungkin juga merupakan ide yang buruk . Anda harus memikirkan apa yang harus dilacak, kasus per kasus. Misalnya sangat buruk untuk melacak parameter suatu metode
void Authenticate(string userName, string plainPassword)
.Tergantung. Beberapa item harus dilacak, tetapi tidak setiap item.
Sekali lagi, itu tergantung.
Tindakan yang diambil setelah kesalahan yang tidak dapat dipulihkan bisa lebih dari sekadar melacak. Misalnya sisi server, Anda ingin menyimpan pengecualian dalam database untuk analisis lebih lanjut. Selain itu, beberapa pengecualian kurang penting daripada yang lain, dan tidak memerlukan penelusuran.
Lihat poin pertama.
Verbose:
Verbose digunakan untuk melacak apa yang perlu Anda lacak ketika terjadi kesalahan. Ini berarti bahwa dalam kebanyakan kasus, Anda akan menonaktifkan pelacakan pesan verbose, tetapi kadang-kadang, Anda harus men-debug beberapa bagian kode Anda untuk memahami mengapa ada sesuatu yang gagal pada kasus tepi.
Anda biasanya memiliki banyak pesan verbose yang memungkinkan Anda memahami aliran aplikasi dengan sangat baik. Ini juga berarti bahwa pesan-pesan itu harus dinonaktifkan sebagian besar karena:
Pikirkan tentang verbose sebagai alat yang harus Anda gunakan ketika Anda tidak memiliki akses ke debugger.
Peringatan:
Jejak jenis peringatan digunakan ketika sesuatu yang salah dan penting terjadi, tetapi tidak terlalu penting untuk diperlakukan sebagai kesalahan. Misalnya, RAM rendah mungkin memancarkan peringatan, tetapi tidak ada alasan untuk melacak kesalahan, karena aplikasi Anda dapat berlanjut, bahkan jika itu akan lebih lambat dari biasanya.
Contoh:
Contoh 1: aplikasi gagal membuka file yang diminta pengguna untuk dibuka. File ada dan tidak digunakan, izin diatur dengan benar, tetapi ada sesuatu yang menghalangi pembukaan file. Dalam hal ini, Anda akan melacak kesalahan , karena aplikasi Anda tidak dapat mengelola kasus ini dan terus berfungsi seperti yang diharapkan oleh pengguna (yaitu benar-benar membaca file).
Contoh 2: setelah memeriksa kesalahan dalam contoh pertama, Anda menemukan bahwa kesalahan disebabkan oleh fakta bahwa path file lebih panjang dari 259 karakter. Jadi, Anda refactor kode Anda untuk menangkap
PathTooLongException
. Ketika, waktu berikutnya, pengguna mencoba untuk membuka file yang sama, versi baru dari aplikasi menunjukkan pesan yang menjelaskan bahwa file tersebut terlalu panjang dan harus dipindahkan ke folder lain untuk mempersingkat jalur penuh untuk membuka file ini di aplikasi ini. Anda juga melacak pesan .Contoh 3: aplikasi Anda menghabiskan dua puluh detik untuk membuka dan mem-parsing file kecil sementara sebagian besar file membutuhkan sepuluh hingga seratus milidetik untuk dibuka dan diurai. Anda melacak peringatan dengan info yang relevan: jenis disk tempat file itu sebenarnya, sistem file, ukuran file, waktu yang dihabiskan, waktu komputer dihidupkan, dll. Ketika pengguna mengeluh bahwa dibutuhkan dua puluh detik untuk membuka file, Anda mengambil jejak untuk menemukan apa yang terjadi. Misalnya, Anda menemukan bahwa perlu waktu lama untuk memuat file dari jaringan ketika komputer baru saja dimulai. Anda menjelaskan kepada pengguna bahwa penundaan itu disebabkan oleh jaringan dan tidak terkait dengan aplikasi Anda.
Contoh 4: file yang dibuka ditampilkan secara tidak benar. Anda mengaktifkan jejak verbose di mana Anda benar-benar melihat bagaimana data dimuat dari file dan kemudian diuraikan, langkah demi langkah.
sumber
System.Diagnostics
hebat karena Anda dapat mengonfigurasi ke mana informasi jejak harus pergi ke mana (file, eventlog, database, ....)Sayangnya, jika Anda ingin menggunakan,
System.Diagnostics
Anda harus tahu sebelumnya ( pada waktu desain ), jejak-aliran mana yang harus diikuti. (Dalam artikel contoh ini adalah Transfer, Lanjutkan, Tangguhkan, ...). Ini dapat dikonfigurasi untuk Dinonaktifkan, Debuglevel atau Errorlevel.Saya lebih suka memiliki sistem logging di mana saya dapat memutuskan saat runtime di classlevel / namespacelevel , seberapa rinci seharusnya logging. Misalnya, semua Debug dan di atas dari
MyNamespace.Business.*
tetapi tidakMyNamespace.Business.Calculations
.Jika Anda menggunakan log4net (atau Common.logging) setiap kelas mendapatkan loggernya sendiri sehingga Anda dapat dengan mudah memutuskan kelas mana yang masuk pada tingkat mana.
Karena operasi Database berada dalam kelas yang terpisah, tidak ada lagi kebutuhan untuk aturan yang berbeda
Sebaliknya saya lebih suka memiliki pedoman ini:
sumber
Anda dapat mencoba kerangka kerja Story , ia memiliki pendekatan unik untuk login karena "membuat" Anda menulis semua log (dan menambahkan informasi relevan lainnya) dalam konteksnya sehingga ketika Anda perlu membacanya nanti Anda mendapatkan semua yang Anda butuhkan.
Ini akan secara otomatis menambahkan konsep "mulai" dan "berhenti" sebagai awal dan akhir sebuah cerita.
Dan dengan sistem berbasis aturan Anda dapat mengontrol apa yang harus dilakukan dengan setiap cerita (konteks) berdasarkan informasi yang dimilikinya, misalnya mencetak semua cerita yang memiliki kesalahan atau berasal dari pengguna "admin".
Juga informasi lebih lanjut tentang posting blog ini
sumber