Bagaimana menerapkan logger sederhana di C #

Anda akan sering ingin mencatat peristiwa atau kesalahan saat terjadi di aplikasi .Net Anda. Untuk melakukan ini, Anda dapat memanfaatkan salah satu dari banyak kerangka kerja logging populer yang tersedia, atau Anda dapat merancang dan mengembangkan kerangka kerja logging Anda sendiri. Dalam artikel ini kita akan melihat bagaimana kita dapat merancang dan mengembangkan kerangka kerja logging kita sendiri dengan mudah, dan mengikuti langkah-langkah untuk membangun logger sederhana di C #.

Pertama, Anda perlu memahami target log — berbagai tempat di mana data dapat dicatat. Mari kita asumsikan bahwa kita akan mencatat data ke file datar, database, dan log peristiwa. Pencacahan berikut mendefinisikan target log yang akan kita gunakan dalam kerangka sederhana ini.

public enum LogTarget

    {

        File, Database, EventLog

    }

Kelas C # logger

Langkah selanjutnya adalah merancang dan mengimplementasikan kelas. Kami akan menggunakan tiga kelas-yaitu yang berbeda, FileLogger, DBLogger, dan EventLogger-untuk log data ke file, database, dan log event masing-masing. Semua kelas ini harus mewarisi kelas dasar abstrak bernama LogBase. Beginilah cara kelas-kelas ini diatur.

    public abstract class LogBase

    {

        public abstract void Log(string message);

    }

    public class FileLogger : LogBase

     {

        public string filePath = @”D:\Log.txt”;

        public override void Log(string message)

        {

            using (StreamWriter streamWriter = new StreamWriter(filePath))

            {

                streamWriter.WriteLine(message);

                streamWriter.Close();

            }           

        }

    }

public class DBLogger : LogBase

    {

        string connectionString = string.Empty;

        public override void Log(string message)

        {

            //Code to log data to the database

        }

    }

    public class EventLogger: LogBase

    {

        public override void Log(string message)

        {

            EventLog eventLog = new EventLog(“”);

            eventLog.Source;

            eventLog.WriteEntry(message);

        }

    }                                

Saya telah meninggalkan DBLoggerkelas tidak lengkap. Saya akan menyerahkan kepada Anda untuk mengisi kode yang sesuai untuk mencatat pesan Anda ke database.

Seperti yang Anda lihat, ketiga kelas - FileLogger, EventLogger, dan DBLogger- memperpanjang kelas dasar abstrak LogBase. Kelas dasar abstrak LogBasemendeklarasikan metode abstrak yang dipanggil Log(). The Log() Metode menerima string sebagai parameter; string ini adalah apa yang akan dicatat ke file atau database atau log peristiwa. 

Kelas C # LogHelper

Sekarang mari kita buat kelas pembantu yang dapat digunakan untuk memanggil logger terkait berdasarkan parameter yang diteruskan. Kelas helper ini akan digunakan untuk menyederhanakan panggilan ke Log()metode di setiap kelas logger. Potongan kode berikut menggambarkan kelas helper ini.

public static class LogHelper

    {

        private static LogBase logger = null;

        public static void Log(LogTarget target, string message)

        {

            switch(target)

            {

                case LogTarget.File:

                    logger = new FileLogger();

                    logger.Log(message);

                    break;

                case LogTarget.Database:

                    logger = new DBLogger();

                    logger.Log(message);

                    break;

                case LogTarget.EventLog:

                    logger = new EventLogger();

                    logger.Log(message);

                    break;

                default:

                    return;

            }

        }

    }

The Log() metode dari LogHelperkelas menerima string dan sebuah contoh dari LogTargetpencacahan sebagai parameter. Ini kemudian menggunakan switch: casekonstruksi untuk menentukan target di mana pesan teks akan dicatat.

Menyinkronkan panggilan ke metode C # Log

Ups! Kami lupa menyinkronkan panggilan ke Log()metode masing-masing . Untuk melakukan ini, kita perlu menggunakan kata kunci kunci dalam Log()metode masing-masing kelas logger dan memasukkan kode yang sesuai untuk menyinkronkan  Log()metode tersebut. Lihat LogBasekelas yang diberikan di bawah ini. Kami telah memasukkan anggota yang dilindungi yang akan digunakan untuk menerapkan kunci dalam Log()metode setiap kelas turunan. Berikut adalah versi modifikasi dari kelas-kelas ini.

public abstract class LogBase

    {

        protected readonly object lockObj = new object();

        public abstract void Log(string message);

    }

    public class FileLogger : LogBase

    {

        public string filePath = @”D:\Log.txt”;

        public override void Log(string message)

        {

            lock (lockObj)

            {

                using (StreamWriter streamWriter = new StreamWriter(filePath))

                {

                    streamWriter.WriteLine(message);

                    streamWriter.Close();

                }

            }

        }

    }

    public class EventLogger : LogBase

    {

        public override void Log(string message)

        {

            lock (lockObj)

            {

                EventLog m_EventLog = new EventLog(“”);

                m_EventLog.Source;

                m_EventLog.WriteEntry(message);

            }

        }

    }

    public class DBLogger : LogBase

    {

        string connectionString = string.Empty;

        public override void Log(string message)

        {

            lock (lockObj)

            {

                //Code to log data to the database

            }

        }

    }

Sekarang Anda dapat memanggil Log()metode LogHelperkelas dan meneruskan target log dan pesan teks ke log sebagai parameter.

class Program

    {

        static void Main(string[] args)

        {

            LogHelper.Log(LogTarget.File, “Hello”);

        }

    }

Jika Anda perlu memasukkan pesan teks ke log target yang berbeda, Anda cukup meneruskan target log yang sesuai sebagai parameter ke Log()metode LogHelperkelas.

Ada banyak cara untuk meningkatkan kerangka kerja logging ini. Anda dapat mengimplementasikan asynchrony dan antrian sehingga ketika sejumlah besar pesan datang, logger dapat memproses pesan-pesan ini secara asinkron tanpa harus memblokir thread saat ini. Anda mungkin juga ingin menerapkan tingkat kekritisan pesan, seperti pesan informasional, pesan peringatan, pesan kesalahan, dan sebagainya.