Praktik terbaik untuk masuk dan melacak di .NET

53

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.Diagnosticsnamespace. 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.WriteLineIfdan kemudian verifikasi hal-hal seperti SourceSwitch.TraceInformationdan SourceSwitch.TraceErrors, dan bahkan tidak memiliki properti seperti TraceVerboseatau 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

Levidad
sumber
mungkin lebih disukai cara logging-in-net-deployed-to-azure di stackoverflow juga membantu.
k3b
aplikasi sampel kode sumber lengkap menggunakan patters yang baik untuk login?
Kiquenet
Jujur ... Jika saya bekerja dengan .NET saya mungkin hanya menginstal sesuatu seperti New Relic dan menyebutnya selesai. (Mungkin bukan pilihan yang baik pada saat ini diposting)
svidgen

Jawaban:

17

Pentingnya jenis jejak harus dipilih bukan karena di mana jejak berada dalam kode, tetapi karena pesan yang dilacak lebih atau kurang penting. Contoh:

Lacak peristiwa "Mulai" saat memulai metode, yang harus mewakili operasi logis tunggal atau pipa, bersama dengan representasi string dari nilai parameter yang diteruskan ke metode.

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).

Lacak peristiwa "Informasi" saat memasukkan item ke dalam basis data.

Tergantung. Beberapa item harus dilacak, tetapi tidak setiap item.

  • Misalnya bayangkan Anda benar-benar memasukkan item log ke dalam database Anda. Apakah Anda melacak log? Dan kemudian mencatat jejak? Dan kemudian melacak pencatatan jejak?
  • Contoh lain: Anda memasukkan data sensitif. Ini membutuhkan audit. Karena Anda mengaudit sisipan, mengapa menelusurinya?

Lacak kejadian "Informasi" saat mengambil satu jalur atau lainnya dalam pernyataan if / else penting.

Sekali lagi, itu tergantung.

Lacak "Kritis" atau "Kesalahan" di blok tangkap tergantung pada cuaca ini merupakan kesalahan yang dapat dipulihkan.

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.

Lacak acara "Stop" saat menyelesaikan eksekusi metode.

Lihat poin pertama.

tolong jelaskan kapan terbaik untuk melacak jenis acara Verbose dan Peringatan.

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:

  • jika tidak, log akan tumbuh sangat cepat,
  • Anda tidak membutuhkan mereka sebagian besar waktu,
  • mereka mungkin berisi data sensitif tentang aliran aplikasi.

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.

Arseni Mourzenko
sumber
Salah satu pola yang kami gunakan di tempat saya bekerja adalah mencatat "unknownErrors" sebagai peringatan dan "UnknownErrors" sebagai kesalahan. Mungkin tidak sesuai tergantung pada infrastruktur Anda dan bagaimana hal itu berkaitan dengan peringatan, tetapi itu bekerja dengan baik untuk kami.
Andrew Piliser
5
 > say I want to do my tracing and logging using only the standard .NET classes

System.Diagnostics hebat karena Anda dapat mengonfigurasi ke mana informasi jejak harus pergi ke mana (file, eventlog, database, ....)

Sayangnya, jika Anda ingin menggunakan, System.DiagnosticsAnda 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 tidak MyNamespace.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

Trace an "Information" event when inserting an item into the database.

Sebaliknya saya lebih suka memiliki pedoman ini:

  • Tracelevel harus menunjukkan alur kerja dasar
  • Debuglevel harus menunjukkan data terperinci dan pemrosesan dalam alur kerja, termasuk keputusan dalam alur program dengan alasan (Membuat item baru karena item tidak ada dalam DB)
  • Infolevel untuk memulai / menghentikan layanan dan satu entri untuk setiap alur kerja / tindakan GUI dimulai
k3b
sumber
Begitu ya, itu info yang bagus, terima kasih! Tapi tetap saja, seperti yang saya tanyakan dalam pertanyaan awal saya, bisakah Anda menjelaskan penggunaan jenis acara Verbose dan Peringatan? Dan juga, saya meminta orang lain untuk berkontribusi dengan sudut pandang mereka, karena topik ini pantas dijelajahi lebih dalam daripada yang saya lihat di internet.
Levidad
4

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

Amit Apple
sumber
1
jawaban diperbarui dengan informasi lebih lanjut
Amit Apple