Pengelogan dan pelacakan .NET
Kode dapat diinstrumentasikan untuk menghasilkan log, yang berfungsi sebagai catatan peristiwa menarik yang terjadi saat program sedang berjalan. Untuk memahami perilaku aplikasi, log dapat ditinjau. .NET telah mengumpulkan beberapa API pengelogan yang berbeda selama riwayatnya dan artikel ini akan membantu Anda memahami opsi apa yang tersedia.
Catatan
Terkadang pengelogan juga disebut sebagai 'pelacakan', termasuk di beberapa API Windows dan .NET yang lebih lama. Dalam beberapa tahun terakhir, 'pelacakan' lebih umum digunakan sebagai singkatan untuk pelacakan Terdistribusi, tetapi itu bukan arti dalam artikel ini.
API pengelogan .NET
ILogger
Untuk sebagian besar kasus, baik menambahkan pengelogan ke proyek yang ada atau membuat proyek baru, infrastruktur ILogger adalah pilihan default yang baik. ILogger
mendukung pengelogan terstruktur yang cepat, konfigurasi fleksibel, dan kumpulan sink umum termasuk konsol, yang anda lihat saat menjalankan aplikasi ASP.NET. Selain itu, ILogger
antarmuka juga dapat berfungsi sebagai fasad atas banyak implementasi pengelogan pihak ketiga yang menawarkan fungsionalitas dan ekstensibilitas yang kaya.
ILogger menyediakan cerita pengelogan untuk implementasi OpenTelemetry untuk .NET, yang memungkinkan keluarnya log dari aplikasi Anda ke berbagai sistem APM untuk analisis lebih lanjut.
EventSource
EventSource adalah API berkinerja tinggi yang lebih lama dengan pengelogan terstruktur. Awalnya dirancang untuk berintegrasi dengan baik dengan Event Tracing for Windows (ETW), tetapi kemudian diperluas untuk mendukung pelacakan lintas platform EventPipe dan EventListener untuk sink kustom. Dibandingkan dengan ILogger
, EventSource
memiliki sink pengelogan yang relatif sedikit dan tidak ada dukungan bawaan untuk dikonfigurasi melalui file konfigurasi terpisah. EventSource
sangat baik jika Anda ingin kontrol yang lebih ketat atas integrasi ETW atau EventPipe, tetapi untuk pengelogan tujuan umum, ILogger
lebih fleksibel dan lebih mudah digunakan.
Trace
System.Diagnostics.Trace dan System.Diagnostics.Debug adalah API pengelogan tertua .NET. Kelas-kelas ini memiliki API konfigurasi yang fleksibel dan ekosistem sink yang besar, tetapi hanya mendukung pengelogan yang tidak terstruktur. Pada .NET Framework mereka dapat dikonfigurasi melalui file app.config, tetapi di .NET Core, tidak ada mekanisme konfigurasi bawaan berbasis file. Mereka biasanya digunakan untuk menghasilkan output diagnostik untuk pengembang saat berjalan di bawah debugger. Tim .NET terus mendukung API ini untuk tujuan kompatibilitas mundur, tetapi tidak ada fungsionalitas baru yang akan ditambahkan. API ini adalah pilihan yang bagus untuk aplikasi yang sudah menggunakannya. Untuk aplikasi yang lebih baru yang belum berkomitmen pada API pengelogan, ILogger
mungkin menawarkan fungsionalitas yang lebih baik.
API pengelogan khusus
Konsol
Kelas System.Console ini memiliki metode Write dan WriteLine yang dapat digunakan dalam skenario pengelogan sederhana. API ini sangat mudah untuk memulai tetapi solusinya tidak akan fleksibel seperti API pengelogan tujuan umum. Konsol hanya mengizinkan pengelogan yang tidak terstruktur dan tidak ada dukungan konfigurasi untuk memilih pesan log mana yang diaktifkan atau untuk ditargetkan ulang ke sink yang berbeda. Menggunakan ILogger atau Trace API dengan sink konsol tidak membutuhkan banyak upaya tambahan dan membuat pengelogan tetap dapat dikonfigurasi.
DiagnosticSource
System.Diagnostics.DiagnosticSource ditujukan untuk pengelogan di mana pesan log akan dianalisis secara sinkron dalam proses daripada diserialisasikan ke penyimpanan apa pun. Ini memungkinkan sumber dan pendengar untuk bertukar objek .NET arbitrer sebagai pesan, sedangkan sebagian besar API pengelogan mengharuskan peristiwa log dapat diserialisasikan. Teknik ini juga bisa sangat cepat, menangani peristiwa log dalam puluhan nanodetik jika pendengar diimplementasikan secara efisien. Alat yang menggunakan API ini sering bertindak lebih seperti profiler dalam proses, meskipun API tidak memberlakukan batasan apa pun di sini.
EventLog
System.Diagnostics.EventLog adalah API khusus Windows yang menulis pesan ke Windows EventLog. Dalam banyak kasus menggunakan ILogger dengan sink EventLog opsional saat berjalan di Windows dapat memberikan fungsionalitas serupa tanpa mengkoplorasi aplikasi dengan erat ke OS Windows.
Terminologi pengelogan
Pengelogan terstruktur dan tidak terstruktur
Pengelogan dapat terstruktur atau tidak terstruktur:
- Tidak terstruktur: Entri log dikodekan sebagai teks bentuk bebas yang dapat dibaca manusia tetapi sulit untuk mengurai dan mengkueri secara terprogram.
- Terstruktur: Entri log memiliki skema yang terdefinisi dengan baik dan dapat dikodekan dalam format biner dan tekstual yang berbeda. Log ini dirancang untuk menjadi mesin yang dapat diterjemahkan dan dapat dikueri sehingga manusia dan sistem otomatis dapat bekerja dengan mudah.
API pengelogan terstruktur yang baik dapat menawarkan lebih banyak fungsionalitas dan performa hanya dengan peningkatan kecil dalam kompleksitas penggunaan.
Sink
Sebagian besar API pengelogan memungkinkan pesan log dikirim ke tujuan berbeda yang disebut sink. Beberapa API memiliki sejumlah besar sink yang telah dibuat sebelumnya, sedangkan yang lain hanya memiliki beberapa. Jika tidak ada sink yang dibuat sebelumnya, biasanya ada API ekstensibilitas yang akan memungkinkan Anda menulis sink kustom, meskipun ini memerlukan penulisan sedikit lebih banyak kode.