כיצד ליישם לוגר פשוט ב- C #

לרוב תרצה לרשום אירועים או שגיאות כפי שהם מתרחשים ביישום .Net שלך. לשם כך, תוכל לנצל את אחת ממסגרות הרישום הפופולריות הזמינות, או שתוכל לעצב ולפתח מסגרת רישום משלך. במאמר זה נראה כיצד נוכל לעצב ולפתח את מסגרת הרישום שלנו בקלות, ולעבור בשלבים לבניית לוגר פשוט ב- C #.

ראשית, תצטרכו להבין את יעדי היומן - המקומות השונים שבהם ניתן היה לרשום את הנתונים. נניח שנרשום את הנתונים לקבצים שטוחים, מסד נתונים ויומן האירועים. הספירה הבאה מגדירה את יעדי היומן בהם נשתמש במסגרת פשוטה זו.

public enum LogTarget

    {

        File, Database, EventLog

    }

שיעורי לוגר C #

השלב הבא הוא תכנון והטמעת השיעורים. נשתמש בשלוש כיתות-כלומר נבדל, 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()לשיטות המתאימות . לשם כך, עלינו להשתמש במילת המפתח נעילה 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הכיתה.

ישנן דרכים רבות לשפר את מסגרת הרישום הזו. אתה יכול ליישם אסינכרוניה ותור כך שכאשר מגיעים מספר רב של הודעות, הלוגר יכול לעבד את ההודעות האסינכרוניות מבלי לחסום את השרשור הנוכחי. ייתכן שתרצה גם ליישם רמות קריטיות של הודעות, כגון הודעות מידע, הודעות אזהרה, הודעות שגיאה וכן הלאה.