Cara melaksanakan pembalak sederhana di C #

Anda sering ingin mencatat peristiwa atau kesilapan seperti yang berlaku di aplikasi .Net anda. Untuk melakukan ini, anda boleh memanfaatkan salah satu daripada banyak kerangka pembalakan yang tersedia, atau anda boleh merancang dan mengembangkan kerangka pembalakan anda sendiri. Dalam artikel ini kita akan melihat bagaimana kita dapat merancang dan mengembangkan kerangka pembalakan kita sendiri dengan mudah, dan mengikuti langkah-langkah untuk membina pembalak sederhana di C #.

Pertama, anda perlu memahami sasaran log — pelbagai tempat di mana data dapat dicatat. Mari kita anggap bahawa kita akan log data ke fail rata, pangkalan data, dan log peristiwa. Penghitungan berikut menentukan sasaran log yang akan kita gunakan dalam kerangka mudah ini.

public enum LogTarget

    {

        File, Database, EventLog

    }

Kelas pembalak C #

Langkah seterusnya adalah merancang dan melaksanakan kelas. Kami akan menggunakan tiga kelas-iaitu berbeza, FileLogger, DBLogger, dan EventLogger-untuk log data masing-masing kepada fail, pangkalan data, dan log acara tersebut. Semua kelas ini harus mewarisi kelas asas abstrak yang dinamakan LogBase. Inilah cara 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 kod yang sesuai untuk memasukkan mesej anda ke pangkalan data.

Seperti yang anda lihat, ketiga-tiga kelas - FileLogger, EventLogger, dan DBLogger- melanjutkan kelas asas abstrak LogBase. Kelas asas abstrak LogBasemenyatakan kaedah abstrak yang disebut Log(). The Log() Cara menerima rentetan sebagai parameter; rentetan ini adalah apa yang akan dilog masuk ke fail atau pangkalan data atau log peristiwa. 

Kelas C # LogHelper

Sekarang mari kita buat kelas pembantu yang boleh digunakan untuk memanggil logger masing-masing berdasarkan parameter yang dilalui. Kelas pembantu ini akan digunakan untuk mempermudah panggilan ke Log()kaedah di setiap kelas pembalak. Coretan kod berikut menggambarkan kelas penolong 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() kaedah yang LogHelperkelas menerima rentetan dan atas kehendak LogTargetpenghitungan sebagai parameter. Ia kemudian menggunakan switch: casekonstruk untuk menentukan sasaran di mana mesej teks akan dicatat.

Menyelaraskan panggilan ke kaedah C # Log

Alamak! Kami lupa untuk menyegerakkan panggilan dengan Log()kaedah masing-masing . Untuk melakukan ini, kita perlu menggunakan kata kunci kunci dalam Log()kaedah setiap kelas logger dan memasukkan kod yang sesuai untuk menyegerakkan  Log()kaedah tersebut. Rujuk LogBasekelas yang diberikan di bawah. Kami telah menggabungkan anggota yang dilindungi yang akan digunakan untuk menerapkan kunci dalam Log()kaedah setiap kelas yang diturunkan. Berikut adalah versi kelas yang diubah suai.

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

            }

        }

    }

Anda kini boleh memanggil Log()kaedah LogHelperkelas dan melepasi sasaran log dan mesej teks untuk log sebagai parameter.

class Program

    {

        static void Main(string[] args)

        {

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

        }

    }

Sekiranya anda perlu memasukkan mesej teks ke sasaran log yang berlainan, anda hanya perlu menyampaikan sasaran log yang sesuai sebagai parameter kepada Log()kaedah LogHelperkelas.

Terdapat banyak cara untuk memperbaiki kerangka pembalakan ini. Anda boleh melaksanakan asynchrony dan antrean sehingga ketika sejumlah besar pesan tiba, logger dapat memproses pesan ini secara asinkron tanpa harus menyekat thread semasa. Anda juga mungkin ingin menerapkan tahap kritikal mesej, seperti mesej maklumat, mesej amaran, mesej ralat, dan sebagainya.