Membuat Log Aplikasi Menggunakan Log4Net

Posted by Kamarudin • 5 minute read • Comments

Secara teknis kita memang tidak bisa membuat aplikasi yang 100% bebas dari bug. Seberapa keraspun kita mencoba pasti aplikasi yang kita buat ada bugnya. Di sisi lain user adalah tester terbaik yang pernah ada :grin:. Mereka bisa melakukan hal-hal luar biasa di luar perkiraan dan skenario kita yang bisa menyebabkan error, sayangnya user biasanya kurang bisa menjelaskan dengan baik apa yang menyebabkan error. Yang jelas, kita tidak dapat memperbaiki bug sampai kita tahu penyebabnya.

Saat ini, sebagian besar aplikasi menggunakan logging sebagai cara untuk menyimpan informasi tentang operasi yang dilakukan, karena data tersebut sangat berguna ketika kita harus mendiagnosa masalah yang terjadi pada saat aplikasi dijalankan. Logging di sini tidak hanya digunakan untuk mencatat error yang terjadi, tapi bisa juga digunakan untuk mencatat operasi harian yang dilakukan oleh aplikasi, seperti operasi simpan, update, delete atau yang lebih dikenal dengan istilah operasi CRUD.

Dari pada kita harus membuat fungsi sendiri untuk melakukan proses logging, ada baiknya kita menggunakan library yang sudah terbukti ampuh, mudah digunakan dan open source. Salah satunya adalah log4net.

Log4net

Log4net adalah library open source yang dibangun di atas teknologi .NET. Dengan menggunakan library ini kita bisa dengan mudah mengatur output dari log, apakah akan ditampilkan langsung di layar console, disimpan ke file text/database atau pilihan output lainnya. Log4net merupakan hasil portingan dari library Log4J yang digunakan untuk Java.

Beberapa fungsi atau fitur Log4net yang akan dibahas pada postingan kali ini adalah:

  • Logger – Logger adalah object yang bertugas mengeluarkan pesan log. Inilah object utama yang kita gunakan dalam kode program.
  • Level - Secara default, Log4net menyediakan beberapa level logging, diurutkan berdasarkan urutan prioritas terendah
    • ALL
    • DEBUG
    • INFO
    • WARN
    • ERROR
    • FATAL
    • OFF
  • Appender - Appender adalah object yang bertugas menampilkan log message. Ada beberapa appender yang biasa digunakan, misalnya:
    • ConsoleAppender - untuk menampilkan log ke console atau command prompt
    • RollingFileAppender - untuk menyimpan log ke dalam file

    Selain itu ada juga appender untuk menyimpan ke database, mengirim email, mengakses log sistem operasi, dan berbagai tujuan lainnya. Untuk informasi lebih lanjut tentang log4net appender bisa Anda cek di sini.

Menggunakan Log4net

Sebelum menggunakan Log4net kita siapkan terlebih dulu project uji cobanya. Project ini bisa langsung Anda download di sini.

Project ini menggunakan konsep Repository Pattern untuk menerapkan konsep separation of concern atau pemisahan kode program berdasarkan fungsinya. Semua kode untuk akses database harus dipisahkan dengan kode untuk pengaturan user interface. Informasi lebih lanjut tentang Repository Pattern bisa Anda cek di sini.

Langkah 1: Menyiapkan tabel untuk menyimpan hasil log

Seperti yang sudah saya jelaskan di bagian intro, bahwa Log4net mempunyai beberapa jenis objek appender yang bertugas untuk menampilkan log, salah satunya adalah appender untuk menyimpan ke database. Karena data lognya akan disimpan ke database, tentunya kita harus menyiapkan struktur tabelnya terlebih dulu. Berdasarkan dokumentasi resmi Apache log4net struktur tabel standar yang digunakan adalah sebagai berikut:

CREATE TABLE Log (
    Id int IDENTITY (1, 1) NOT NULL,
    Date datetime NOT NULL,
    Thread varchar (255) NOT NULL,
    Level varchar (50) NOT NULL,
    Logger varchar (255) NOT NULL,
    Message varchar (4000) NOT NULL,
    Exception varchar (2000) NULL
)

Karena tidak semua field tabel di atas kita butuhkan, selain itu ada beberapa field yang perlu kita tambahkan, sehingga struktur tabel log di atas kita revisi seperti berikut:

CREATE TABLE Logs(
    LogID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
    Level VARCHAR(10), 
    ClassName VARCHAR(200), 
    MethodName VARCHAR(100), 
    Message VARCHAR(100), 
    NewValue VARCHAR(1000), 
    OldValue VARCHAR(1000), 
    Exception VARCHAR(1000), 
    CreatedBy VARCHAR(50), 
    LogDate DATETIME DEFAULT CURRENT_TIMESTAMP
)

Penjelasan struktur tabel:

  • Level – Berisi salah satu level dari Log4net yaitu DEBUG, INFO, WARN, ERROR, FATAL dan level lainnya.
  • ClassName – Berisi namespace dan nama class yang memanggil objek logger
  • MethodName – Berisi nama method yang memanggil objek logger
  • Message – Berisi pesan yang kita tambahkan pada saat memanggil objek logger
  • NewValue – Berisi data yang ditambahkan atau data setelah di edit dalam format json
  • OldValue – Berisi data sebelum di edit atau data yang dihapus
  • Exception – Menyimpan nilai string dari objek exception
  • CreatedBy – Menyimpan informasi user yang menjalankan aplikasi

Di bawah ini adalah contoh hasil log yang sudah disimpan ke dalam database.

Langkah 2: Menambahkan library Log4net via nuget package manager

Library Log4net sudah tersedia di repository nuget sehingga mempermudah kita dalam proses instalasinya.

Langkah 3: Menambahkan class Log4NetRepository dan Log4NetAppender

Setelah menyiapkan tabel logs (langkah 1), langkah berikutnya adalah menambahkan class repository untuk mengakses tabel tersebut. Class ini dibuat berdasarkan repository pattern yang sudah pernah saya bahas di sini.

Class Log4NetRepository ini nantinya akan kita akses melalui class Log4NetAppender. Class Log4NetAppender merupakan class custom Log4Net appender yang merupakan turunan dari class AppenderSkeleton. Class ini akan meng-override method Append.

Setelah itu kita lengkapi kode implementasinya seperti berikut:

Untuk informasi lebih lanjut tentang log4net appender bisa Anda cek di sini.

Langkah 4: Menambahkan konfigurasi Log4Net

Edit file app.config/web.config, di file ini kita akan menambahkan konfigurasi log4net untuk mengeset custom appender dan level logging yang sudah kita buat dilangkah 3.

Langkah 5: Tes Pemanggilan Objek Logger

Sebelum kita lanjut ke tes pemanggilan objek logger, aktifkan terlebih dulu class entry point (Program.cs). Setelah itu tambahkan kode berikut:

Dibaris ke 9, kita menambahkan attribut [assembly: log4net.Config.XmlConfigurator(Watch = true)] yang berfungsi untuk membaca konfigurasi log4net yang tersimpan di file app.config/web.config.

Dibaris 14 kita menambahkan public static objek dengan nama log (logger), objek inilah yang bertugas untuk mengeluaran pesan log. Dan terakhir di baris 23 kita menambahkan custom property dengan nama UserName. Nilai property ini akan di baca oleh class custome Log4Net appender sebelum di simpan ke database.

Setelah semua persiapan selesai, kita akan memanggil objek logger pada event/method tertentu, misal pada saat menyimpan data (Save), Edit data (Update) dan Hapus Data (Delete).

Logger untuk Method Save

Berikut adalah contoh pemanggilan objek logger untuk method Save.

Perhatikan baris ke 115, kita mengeset nilai custom property dengan nama NewValue. Isinya adalah nilai dari objek class model/entity yang sudah di konversi ke format JSON. Method ToJson adalah method extension yang saya tambahkan untuk mempermudah proses konversi dari objek class model/entity ke format json. Saya sendiri menganggap method extension ini sebagai jurus terlarang :grin:, kenapa terlarang karena method extension ini melanggar salah satu aturan dalam dunia OOP yaitu kita bisa menambahkan method baru dari sebuah class tanpa melalui mekanisme pewarisan (inheritance). Berikut kode untuk method extension ToJson.

Kembali ke method Save di atas,jika dipanggil akan menghasilkan log seperti berikut:

Perhatikan field NewValue di atas, isinya adalah nilai dari objek Category yang sudah di konversi ke dalam format json.

Logger untuk Method Delete

Mirip dengan contoh pemanggilan objek logger untuk method Save. Hanya saja di sini kita mengeset nilai custom property dengan nama OldValue yang isinya adalah nilai objek class model/entity yang sudah dikonversi ke json.

Logger untuk Method Update

Khusus untuk method Update kita akan me-log dua data yaitu data sebelum (OldValue) dan sesudah (NewValue) diupdate. Jadi kita akan memanggil objek logger di dua lokasi yang berbeda yaitu di layer User Interface (UI) dan layer Data Access (Repository).

Field NewValue akan berisi dengan data setelah diupdate, sedangkan field OldValue akan berisi dengan data sebelum diupdate.

Terakhir Logger untuk Exception/Error

Untuk log exception/error bisa langsung kita tempatkan di blok try .. catch.

Kesimpulan

Dengan menggunakan library log4net akan memudahkan tugas harian kita dalam membuat log aplikasi.

Selamat MENCOBA :blush:

Comments