Pembaruan: Untuk ekstensi ke System.Diagnostics, menyediakan beberapa pendengar yang hilang yang mungkin Anda inginkan, lihat Essential.Diagnostics pada CodePlex ( http://essentialdiagnostics.codeplex.com/ )
Kerangka kerja
T: Kerangka apa yang Anda gunakan?
A: System.Diagnostics.TraceSource, bawaan untuk .NET 2.0.
Ini memberikan logging yang kuat, fleksibel, kinerja tinggi untuk aplikasi, namun banyak pengembang tidak menyadari kemampuannya dan tidak menggunakannya secara penuh.
Ada beberapa area di mana fungsionalitas tambahan berguna, atau kadang-kadang fungsionalitas ada tetapi tidak terdokumentasi dengan baik, namun ini tidak berarti bahwa seluruh kerangka logging (yang dirancang agar dapat diperluas) harus dibuang dan diganti sepenuhnya seperti beberapa alternatif populer (NLog, log4net, Common.Logging, dan bahkan EntLib Logging).
Daripada mengubah cara Anda menambahkan pernyataan logging ke aplikasi Anda dan menciptakan kembali roda, cukup rentangkan kerangka kerja System.Diagnostics di beberapa tempat yang Anda butuhkan.
Menurut saya kerangka kerja lain, bahkan EntLib, hanya menderita Sindrom Not Invented Here, dan saya pikir mereka membuang-buang waktu untuk menemukan kembali dasar-dasar yang sudah bekerja dengan baik di System.Diagnostics (seperti bagaimana Anda menulis laporan log), daripada mengisi beberapa celah yang ada. Singkatnya, jangan menggunakannya - mereka tidak diperlukan.
Fitur yang mungkin belum Anda ketahui:
- Menggunakan kelebihan TraceEvent yang mengambil string format dan args dapat membantu kinerja karena parameter disimpan sebagai referensi terpisah sampai setelah Filter.ShouldTrace () berhasil. Ini berarti tidak ada panggilan mahal ke ToString () pada nilai parameter sampai setelah sistem mengkonfirmasi pesan akan benar-benar dicatat.
- Trace.CorrelationManager memungkinkan Anda untuk mengkorelasikan pernyataan log tentang operasi logis yang sama (lihat di bawah).
- VisualBasic.Logging.FileLogTraceListener baik untuk menulis file log dan mendukung rotasi file. Meskipun dalam namespace VisualBasic, itu dapat dengan mudah digunakan dalam proyek C # (atau bahasa lain) hanya dengan memasukkan DLL.
- Saat menggunakan EventLogTraceListener jika Anda memanggil TraceEvent dengan beberapa argumen dan dengan string format kosong atau nol, maka args diteruskan langsung ke EventLog.WriteEntry () jika Anda menggunakan sumber daya pesan lokal.
- Alat Service Trace Viewer (dari WCF) berguna untuk melihat grafik file log yang terkait aktivitas (bahkan jika Anda tidak menggunakan WCF). Ini benar-benar dapat membantu men-debug masalah kompleks di mana banyak utas / aktivitas terlibat.
- Hindari overhead dengan membersihkan semua pendengar (atau menghapus Default); jika tidak, Default akan meneruskan semuanya ke sistem jejak (dan mengeluarkan semua biaya overhead ToString ()).
Area yang Anda mungkin ingin lihat meluas (jika perlu):
- Pendengar jejak basis data
- Pendengar jejak konsol berwarna
- Pendengar jejak MSMQ / Email / WMI (jika perlu)
- Terapkan FileSystemWatcher untuk memanggil Trace.Refresh untuk perubahan konfigurasi dinamis
Rekomendasi lain:
Gunakan id acara terstruktur, dan simpan daftar referensi (mis. Dokumentasikan dalam enum).
Memiliki id acara unik untuk setiap acara (signifikan) di sistem Anda sangat berguna untuk menghubungkan dan menemukan masalah tertentu. Mudah untuk melacak kembali ke kode spesifik yang mencatat / menggunakan id acara, dan dapat membuatnya mudah untuk memberikan panduan untuk kesalahan umum, misalnya kesalahan 5178 berarti string koneksi basis data Anda salah, dll.
ID acara harus mengikuti beberapa jenis struktur (mirip dengan Teori Kode Balasan yang digunakan dalam email dan HTTP), yang memungkinkan Anda memperlakukannya berdasarkan kategori tanpa mengetahui kode tertentu.
mis. Digit pertama dapat merinci kelas umum: 1xxx dapat digunakan untuk operasi 'Mulai', 2xxx untuk perilaku normal, 3xxx untuk pelacakan aktivitas, 4xxx untuk peringatan, 5xxx untuk kesalahan, 8xxx untuk operasi 'Stop', 9xxx untuk kesalahan fatal, dll.
Digit kedua dapat merinci area, mis. 21xx untuk informasi basis data (41xx untuk peringatan basis data, 51xx untuk kesalahan basis data), 22xx untuk mode perhitungan (42xx untuk peringatan perhitungan, dll), 23xx untuk modul lain, dll.
Ditugaskan, id acara terstruktur juga memungkinkan Anda menggunakannya dalam filter.
T: Jika Anda menggunakan pelacakan, apakah Anda menggunakan Trace.Correlation.StartLogicalOperation?
A: Trace.CorrelationManager sangat berguna untuk mengkorelasikan laporan log dalam segala jenis lingkungan multi-threaded (yang mana saja saat ini).
Anda setidaknya perlu menetapkan ActivityId sekali untuk setiap operasi logis untuk berkorelasi.
Mulai / Hentikan dan LogicalOperationStack kemudian dapat digunakan untuk konteks berbasis tumpukan sederhana. Untuk konteks yang lebih kompleks (mis. Operasi asinkron), menggunakan TraceTransfer ke ActivityId baru (sebelum mengubahnya), memungkinkan korelasi.
Alat Penilik Jejak Layanan dapat berguna untuk melihat grafik aktivitas (bahkan jika Anda tidak menggunakan WCF).
T: Apakah Anda menulis kode ini secara manual, atau Anda menggunakan beberapa bentuk pemrograman berorientasi aspek untuk melakukannya? Ingin berbagi cuplikan kode?
A: Anda mungkin ingin membuat kelas lingkup, misalnya LogicalOperationScope, yang (a) mengatur konteks saat dibuat dan (b) mengatur ulang konteks saat dibuang.
Ini memungkinkan Anda untuk menulis kode seperti yang berikut untuk membungkus operasi secara otomatis:
using( LogicalOperationScope operation = new LogicalOperationScope("Operation") )
{
// .. do work here
}
Pada pembuatan, ruang lingkup pertama dapat mengatur ActivityId jika diperlukan, panggil StartLogicalOperation dan kemudian log pesan TraceEventType.Start. Pada Buang, itu bisa mencatat pesan Stop, dan kemudian memanggil StopLogicalOperation.
T: Apakah Anda memberikan segala bentuk rincian atas sumber jejak? Misalnya, WPF TraceSources memungkinkan Anda untuk mengonfigurasinya di berbagai tingkatan.
A: Ya, banyak Sumber Jejak berguna / penting karena sistem semakin besar.
Sementara Anda mungkin ingin secara konsisten mencatat semua Peringatan & di atas, atau semua Informasi & pesan di atas, untuk sistem berukuran apa pun, volume Pelacakan Aktivitas (Mulai, Berhenti, dll.) Dan Verbose logging menjadi terlalu banyak.
Daripada hanya memiliki satu sakelar yang menghidupkan atau mematikan semuanya, ada baiknya untuk mengaktifkan informasi ini untuk satu bagian dari sistem Anda sekaligus.
Dengan cara ini, Anda dapat menemukan masalah signifikan dari biasanya masuk (semua peringatan, kesalahan, dll), dan kemudian "memperbesar" pada bagian yang Anda inginkan dan mengaturnya ke Pelacakan Aktivitas atau bahkan tingkat Debug.
Jumlah sumber jejak yang Anda butuhkan tergantung pada aplikasi Anda, mis. Anda mungkin menginginkan satu sumber jejak per perakitan atau per bagian utama aplikasi Anda.
Jika Anda bahkan membutuhkan kontrol yang lebih baik, tambahkan sakelar boolean terpisah untuk menghidupkan / mematikan penelusuran volume tinggi tertentu, misalnya dump pesan mentah. (Atau sumber penelusuran terpisah dapat digunakan, mirip dengan WCF / WPF).
Anda mungkin juga ingin mempertimbangkan sumber penelusuran terpisah untuk Pelacakan Kegiatan vs pencatatan umum (lainnya), karena hal ini dapat membuatnya sedikit lebih mudah untuk mengonfigurasi filter persis seperti yang Anda inginkan.
Perhatikan bahwa pesan masih dapat dikorelasikan melalui ActivityId bahkan jika sumber yang berbeda digunakan, jadi gunakan sebanyak yang Anda butuhkan.
Pendengar
T: Output log apa yang Anda gunakan?
Ini dapat bergantung pada jenis aplikasi apa yang Anda tulis, dan hal-hal apa yang sedang dicatat. Biasanya hal yang berbeda terjadi di tempat yang berbeda (yaitu beberapa output).
Saya biasanya mengklasifikasikan output menjadi tiga kelompok:
(1) Acara - Windows Event Log (dan lacak file)
mis. Jika menulis server / layanan, maka praktik terbaik pada Windows adalah dengan menggunakan Windows Event Log (Anda tidak memiliki UI untuk melapor).
Dalam hal ini semua peristiwa Informasi Fatal, Kesalahan, Peringatan, dan (tingkat layanan) harus masuk ke Windows Event Log. Level Informasi harus disediakan untuk jenis peristiwa tingkat tinggi ini, yang ingin Anda masuki dalam log peristiwa, mis. "Layanan Dimulai", "Layanan Berhenti", "Terhubung ke Xyz", dan mungkin bahkan "Jadwal Diprakarsai" , "Pengguna Masuk", dll.
Dalam beberapa kasus, Anda mungkin ingin membuat penulisan ke log peristiwa sebagai bagian bawaan dari aplikasi Anda dan tidak melalui sistem penelusuran (yaitu, menulis entri Log Event secara langsung). Ini berarti tidak dapat dimatikan secara tidak sengaja. (Perhatikan bahwa Anda juga masih ingin mencatat peristiwa yang sama di sistem penelusuran Anda sehingga Anda dapat berkorelasi).
Sebaliknya, aplikasi Windows GUI umumnya akan melaporkan ini kepada pengguna (meskipun mereka juga dapat masuk ke Windows Event Log).
Peristiwa mungkin juga memiliki penghitung kinerja terkait (mis. Jumlah kesalahan / detik), dan penting untuk mengkoordinasikan setiap penulisan langsung ke Log Peristiwa, penghitung kinerja, penulisan ke sistem penelusuran dan pelaporan kepada pengguna sehingga terjadi di waktu yang sama.
yaitu Jika pengguna melihat pesan kesalahan pada waktu tertentu, Anda harus dapat menemukan pesan kesalahan yang sama di Windows Event Log, dan kemudian acara yang sama dengan stempel waktu yang sama di log jejak (bersama dengan rincian jejak lainnya).
(2) Kegiatan - File Log Aplikasi atau tabel database (dan melacak file)
Ini adalah aktivitas reguler yang dilakukan oleh suatu sistem, misalnya halaman web yang dilayani, perdagangan pasar saham yang diajukan, pesanan yang diambil, perhitungan yang dilakukan, dll.
Pelacakan Aktivitas (mulai, berhenti, dll) berguna di sini (pada granualitas yang tepat).
Juga, sangat umum untuk menggunakan Log Aplikasi tertentu (kadang-kadang disebut Log Audit). Biasanya ini adalah tabel database atau file log aplikasi dan berisi data terstruktur (yaitu seperangkat bidang).
Hal-hal bisa menjadi sedikit kabur di sini tergantung pada aplikasi Anda. Contoh yang baik mungkin server web yang menulis setiap permintaan ke log web; contoh serupa mungkin sistem pesan atau sistem perhitungan di mana setiap operasi dicatat bersama dengan rincian khusus aplikasi.
Contoh yang tidak begitu baik adalah perdagangan pasar saham atau sistem pemesanan penjualan. Dalam sistem ini, Anda mungkin sudah mencatat aktivitas karena memiliki nilai bisnis yang penting, namun prinsip menghubungkannya dengan tindakan lain masih penting.
Selain log aplikasi khusus, kegiatan juga sering memiliki penghitung kinerja terkait, misalnya jumlah transaksi per detik.
Secara umum Anda harus mengoordinasikan pencatatan aktivitas di berbagai sistem yang berbeda, yaitu menulis ke log aplikasi Anda pada saat yang sama saat Anda meningkatkan penghitung kinerja dan masuk ke sistem penelusuran Anda. Jika Anda melakukan semuanya pada waktu yang bersamaan (atau saling berhadapan dalam kode), maka masalah debug lebih mudah (daripada jika semuanya terjadi pada waktu / lokasi yang berbeda dalam kode).
(3) Debug Trace - File teks, atau mungkin XML atau database.
Ini adalah informasi pada level Verbose dan lebih rendah (mis. Sakelar boolean khusus untuk menghidupkan / mematikan dump data mentah). Ini memberikan nyali atau detail tentang apa yang dilakukan sistem pada tingkat sub-aktivitas.
Ini adalah level yang Anda inginkan untuk menghidupkan / mematikan untuk setiap bagian dari aplikasi Anda (karenanya berbagai sumber). Anda tidak ingin barang-barang ini mengacaukan Windows Event Log. Kadang-kadang database digunakan, tetapi lebih mungkin menggulung file log yang dibersihkan setelah waktu tertentu.
Perbedaan besar antara informasi ini dan file Log Aplikasi adalah tidak terstruktur. Sementara Log Aplikasi mungkin memiliki bidang Untuk, Dari, Jumlah, dll., Jejak debug Verbose dapat berupa apa pun yang dimasukkan oleh programmer, misalnya "memeriksa nilai X = {value}, Y = false", atau komentar / penanda acak seperti " Selesai, coba lagi ".
Salah satu praktik penting adalah memastikan hal-hal yang Anda masukkan ke file log aplikasi atau Windows Event Log juga masuk ke sistem penelusuran dengan detail yang sama (mis. Stempel waktu). Ini memungkinkan Anda untuk mengkorelasikan log yang berbeda saat menyelidiki.
Jika Anda berencana untuk menggunakan penampil log tertentu karena Anda memiliki korelasi yang kompleks, misalnya Penampil Jejak Layanan, maka Anda perlu menggunakan format yang sesuai yaitu XML. Jika tidak, file teks sederhana biasanya cukup baik - pada level yang lebih rendah informasi sebagian besar tidak terstruktur, sehingga Anda mungkin menemukan dump array, stack stack, dll. Asalkan Anda dapat dikorelasikan kembali ke log yang lebih terstruktur pada level yang lebih tinggi, hal-hal yang harus baiklah.
T: Jika menggunakan file, apakah Anda menggunakan rolling log atau hanya satu file? Bagaimana Anda membuat log tersedia untuk dikonsumsi orang?
A: Untuk file, umumnya Anda ingin menggulirkan file log dari sudut pandang pengelolaan (dengan System.Diagnostics cukup gunakan VisualBasic.Logging.FileLogTraceListener).
Ketersediaan lagi tergantung pada sistem. Jika Anda hanya berbicara tentang file maka untuk server / layanan, file bergulir hanya dapat diakses saat diperlukan. (Windows Event Log atau Log Aplikasi Database akan memiliki mekanisme aksesnya sendiri).
Jika Anda tidak memiliki akses yang mudah ke sistem file, maka debug penelusuran ke database mungkin lebih mudah. [yaitu mengimplementasikan TraceListener basis data].
Salah satu solusi menarik yang saya lihat untuk aplikasi Windows GUI adalah bahwa ia mencatat informasi penelusuran yang sangat rinci ke "perekam penerbangan" ketika sedang berjalan dan kemudian ketika Anda mematikannya jika tidak ada masalah, maka ia hanya menghapus file.
Namun, jika macet atau mengalami masalah maka file tidak terhapus. Entah jika itu menangkap kesalahan, atau waktu berikutnya dijalankan akan melihat file, dan kemudian dapat mengambil tindakan, misalnya kompres (mis. 7zip) dan kirimkan melalui email atau jika tidak tersedia.
Banyak sistem saat ini menggabungkan pelaporan kegagalan otomatis ke server pusat (setelah memeriksa dengan pengguna, misalnya untuk alasan privasi).
Melihat
T: Alat apa yang Anda gunakan untuk melihat log?
A: Jika Anda memiliki banyak log untuk alasan yang berbeda, maka Anda akan menggunakan banyak pemirsa.
Notepad / vi / Notepad ++ atau editor teks lainnya adalah dasar untuk log teks biasa.
Jika Anda memiliki operasi yang kompleks, misalnya aktivitas dengan transfer, maka Anda tentu saja akan menggunakan alat khusus seperti Service Trace Viewer. (Tetapi jika Anda tidak membutuhkannya, maka editor teks lebih mudah).
Karena saya biasanya mencatat informasi tingkat tinggi ke Windows Event Log, maka ia menyediakan cara cepat untuk mendapatkan gambaran umum, secara terstruktur (mencari ikon kesalahan / peringatan yang cantik). Anda hanya perlu mulai berburu melalui file teks jika tidak ada cukup dalam log, meskipun setidaknya log memberi Anda titik awal. (Pada titik ini, memastikan log Anda telah mengkoordinasikan entires menjadi berguna).
Secara umum, Windows Event Log juga membuat peristiwa penting ini tersedia untuk alat pemantauan seperti MOM atau OpenView.
Lainnya -
Jika Anda masuk ke Database, mudah untuk memfilter dan mengurutkan informatio (mis. Memperbesar id aktivitas tertentu. (Dengan file teks, Anda dapat menggunakan Grep / PowerShell atau serupa dengan memfilter pada GUID partiular yang Anda inginkan)
MS Excel (atau program spreadsheet lain). Ini dapat berguna untuk menganalisis informasi terstruktur atau semi-terstruktur jika Anda dapat mengimpornya dengan pembatas yang tepat sehingga nilai yang berbeda masuk dalam kolom yang berbeda.
Saat menjalankan layanan dalam debug / tes saya biasanya menyimpannya di aplikasi konsol untuk kesederhanaan saya menemukan logger konsol berwarna berguna (misalnya merah untuk kesalahan, kuning untuk peringatan, dll). Anda perlu menerapkan pendengar jejak khusus.
Perhatikan bahwa framework tidak menyertakan logger konsol berwarna atau logger database jadi, saat ini, Anda perlu menulis ini jika Anda membutuhkannya (tidak terlalu sulit).
Ini benar-benar mengganggu saya bahwa beberapa kerangka kerja (log4net, EntLib, dll) telah membuang-buang waktu menciptakan kembali roda dan mengimplementasikan kembali pencatatan, penyaringan, dan pencatatan dasar ke file teks, Windows Event Log, dan file XML, masing-masing dalam dirinya sendiri cara yang berbeda (masing-masing pernyataan log berbeda); masing-masing kemudian menerapkan versi mereka sendiri, misalnya, logger basis data, ketika sebagian besar sudah ada dan semua yang diperlukan adalah beberapa lebih banyak pendengar jejak untuk System.Diagnostics. Bicara tentang upaya duplikat yang sangat besar.
T: Jika Anda sedang membangun solusi ASP.NET, apakah Anda juga menggunakan ASP.NET Health Monitoring? Apakah Anda menyertakan jejak keluaran dalam acara monitor kesehatan? Bagaimana dengan Trace.axd?
Hal-hal ini dapat dinyalakan / dimatikan sesuai kebutuhan. Saya menemukan Trace.axd cukup berguna untuk men-debug bagaimana server merespons hal-hal tertentu, tetapi umumnya tidak berguna dalam lingkungan yang banyak digunakan atau untuk penelusuran jangka panjang.
T: Bagaimana dengan penghitung kinerja khusus?
Untuk aplikasi profesional, terutama server / layanan, saya berharap melihatnya sepenuhnya terinstal dengan penghitung Monitor Kinerja dan masuk ke Windows Event Log. Ini adalah alat standar di Windows dan harus digunakan.
Anda harus memastikan bahwa Anda menyertakan pemasang untuk penghitung kinerja dan log peristiwa yang Anda gunakan; ini harus dibuat pada waktu instalasi (saat menginstal sebagai administrator). Ketika aplikasi Anda berjalan dengan normal, aplikasi itu seharusnya tidak perlu memiliki hak administrasi (sehingga tidak akan dapat membuat log yang hilang).
Ini adalah alasan yang bagus untuk berlatih mengembangkan sebagai non-administrator (memiliki akun admin terpisah ketika Anda perlu menginstal layanan, dll). Jika menulis ke Log Kejadian, .NET akan secara otomatis membuat log yang hilang saat pertama kali Anda menulisnya; jika Anda berkembang sebagai non-admin, Anda akan mengetahui hal ini lebih awal dan menghindari kejutan yang tidak menyenangkan ketika pelanggan menginstal sistem Anda dan kemudian tidak dapat menggunakannya karena mereka tidak berjalan sebagai administrator.