Kako implementirati jednostavni zapisnik u C #

Često ćete htjeti prijaviti događaje ili pogreške kako se pojave u vašoj .Net aplikaciji. Da biste to učinili, mogli biste iskoristiti jedan od mnogih dostupnih popularnih okvira za bilježenje ili biste mogli dizajnirati i razviti vlastiti okvir za bilježenje. U ovom ćemo članku vidjeti kako s lakoćom možemo dizajnirati i razviti vlastiti okvir za bilježenje i proći kroz korake za izgradnju jednostavnog zapisnika u C #.

Prvo ćete trebati razumjeti ciljeve dnevnika - različita mjesta na kojima se podaci mogu bilježiti. Pretpostavimo da ćemo podatke evidentirati u ravne datoteke, bazu podataka i zapisnik događaja. Sljedeće nabrajanje definira ciljeve dnevnika koje bismo koristili u ovom jednostavnom okviru.

public enum LogTarget

    {

        File, Database, EventLog

    }

C # klase zapisničara

Sljedeći je korak osmišljavanje i provedba nastave. Mi ćemo koristiti tri različita predavanja, naime, FileLogger, DBLoggeri EventLogger-to prijaviti podatke u datoteku, bazu podataka, te u zapisnik događaja respektivno. Sve ove klase trebale bi naslijediti apstraktnu osnovnu klasu imenovanu LogBase. Evo kako su organizirani ti tečajevi.

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

        }

    }                                

Predavanje sam ostavio DBLoggernepotpunom. Ostavit ću vam da ispunite odgovarajući kod za prijavu vaših poruka u bazu podataka.

Kao što možete vidjeti, sve tri klase - FileLogger, EventLoggeri DBLogger- proširiti apstraktna osnovna klasa LogBase. Apstraktna osnovna klasa LogBasedeklarira apstraktnu metodu koja se naziva Log(). Log() Postupak prihvaća niz kao parametar; ovaj je niz ono što će biti zabilježeno u datoteku ili bazu podataka ili zapisnik događaja. 

Klasa C # LogHelper

Sada stvorimo pomoćnu klasu koja se može koristiti za pozivanje odgovarajućeg zapisnika na temelju proslijeđenog parametra. Ova pomoćna klasa koristit će se za pojednostavljivanje poziva Log()metode u svakoj od klasa zapisnika. Sljedeći isječak koda ilustrira ovu pomoćnu klasu.

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() Metoda LogHelperklase prihvaća niz i instancu LogTargetnabrajanje kao parametara. Zatim koristi switch: casekonstrukciju za određivanje cilja na kojem će se zapisati tekstna poruka.

Sinkronizacija poziva s metodom C # Log

Ups! Zaboravili smo sinkronizirati pozive s odgovarajućim Log()metodama. Da bismo to učinili, trebamo upotrijebiti ključnu riječ lock u Log()metodi svake klase dnevnika i uključiti odgovarajući kôd za sinkronizaciju tih  Log()metoda. Pogledajte LogBaserazred naveden u nastavku. Uključili smo zaštićeni član koji će se koristiti za primjenu brave u Log()metodu svake od izvedenih klasa. Evo izmijenjenih verzija ovih klasa.

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

            }

        }

    }

Sada možete nazvati Log()metodu LogHelperklase i proslijediti cilj dnevnika i tekstualnu poruku da se zapisuju kao parametri.

class Program

    {

        static void Main(string[] args)

        {

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

        }

    }

Ako ikada trebate prijaviti tekstualnu poruku na drugi cilj dnevnika, jednostavno ćete proslijediti odgovarajući cilj dnevnika kao parametar Log()metodi LogHelperklase.

Postoji mnogo načina na koje biste mogli poboljšati ovaj okvir bilježenja. Možete implementirati asinkronost i red, tako da kada pristigne velik broj poruka, zapisnik može asinkrono obrađivati ​​te poruke bez potrebe za blokiranjem trenutne niti. Možda ćete htjeti primijeniti i razine kritičnosti poruka, kao što su informativne poruke, poruke upozorenja, poruke pogreške i tako dalje.