Как да внедрите прост регистратор в C #

Често ще искате да регистрирате събития или грешки, тъй като те се появяват във вашето приложение .Net. За да направите това, можете да се възползвате от една от многото популярни налични рамки за регистриране или да проектирате и разработите своя собствена рамка за регистриране. В тази статия ще видим как можем да проектираме и разработим нашата собствена рамка за регистриране с лекота и ще преминем през стъпките за изграждане на обикновен регистратор в C #.

Първо, ще трябва да разберете целите на дневника - различните места, където данните могат да бъдат регистрирани. Нека приемем, че ще регистрираме данните в плоски файлове, база данни и дневник на събитията. Следващото изброяване определя целите на дневника, които бихме използвали в тази проста рамка.

public enum LogTarget

    {

        File, Database, EventLog

    }

C # logger класове

Следващата стъпка е проектирането и изпълнението на класовете. Ние ще използваме три различни класове-а именно FileLogger, DBLoggerи EventLogger-да влезете данни към файл, база данни, както и дневник на събитията съответно. Всички тези класове трябва да наследят абстрактния основен клас с име LogBase. Ето как са организирани тези класове.

    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);

        }

    }                                

Оставих DBLoggerкласа незавършен. Ще оставя на вас да попълните съответния код, за да регистрирате вашите съобщения в базата данни.

Както можете да видите, и трите от класовете - FileLogger, EventLoggerи DBLogger- да се разшири абстрактен базов клас LogBase. Абстрактният основен клас LogBaseдекларира наречения абстрактен метод Log(). В Log() метода приема низ като параметър; този низ е това, което ще бъде регистрирано във файл или база данни или в дневника на събитията. 

Класът C # LogHelper

Сега нека създадем помощен клас, който може да се използва за извикване на съответния регистратор въз основа на предадения параметър. Този помощен клас ще се използва за опростяване на извикванията на Log()метода във всеки от класовете на регистратора. Следният кодов фрагмент илюстрира този помощен клас.

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;

            }

        }

    }

В Log() метода от LogHelperкласа приема поредица и копие на LogTargetизброяването като параметри. След това използва switch: caseконструкция, за да определи целта, където ще се регистрира текстовото съобщение.

Синхронизиране на обажданията до метода C # Log

Ами сега! Забравихме да синхронизираме разговорите със съответните Log()методи. За целта трябва да използваме ключовата дума lock в Log()метода на всеки от класовете на регистратора и да включим съответния код за синхронизиране на тези  Log()методи. Обърнете се към LogBaseкласа, даден по-долу. Включихме защитен член, който ще се използва за прилагане на заключването в Log()метода на всеки от производните класове. Ето модифицираните версии на тези класове.

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

            }

        }

    }

Вече можете да извикате Log()метода на LogHelperкласа и да предадете целта на дневника и текстовото съобщение, за да регистрирате като параметри.

class Program

    {

        static void Main(string[] args)

        {

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

        }

    }

Ако някога се наложи да регистрирате текстовото съобщение в различна цел на дневника, просто ще предадете подходящата цел на регистрационния файл като параметър на Log()метода на LogHelperкласа.

Има много начини да подобрите тази рамка за регистриране. Можете да внедрите асинхронност и опашка, така че когато пристигнат голям брой съобщения, регистраторът може да обработва тези съобщения асинхронно, без да се налага да блокира текущата нишка. Може да искате да внедрите нива на критичност на съобщенията, като информационни съобщения, предупредителни съобщения, съобщения за грешки и т.н.