C #에서 간단한 로거를 구현하는 방법

.Net 애플리케이션에서 발생하는 이벤트 또는 오류를 기록하고자하는 경우가 많습니다. 이를 위해 사용 가능한 많은 인기 로깅 프레임 워크 중 하나를 활용하거나 고유 한 로깅 프레임 워크를 설계하고 개발할 수 있습니다. 이 기사에서는 자체 로깅 프레임 워크를 쉽게 설계하고 개발할 수있는 방법을 살펴보고 C #으로 간단한 로거를 빌드하는 단계를 안내합니다.

먼저, 로그 대상 (데이터가 기록 될 수있는 다양한 위치)을 이해해야합니다. 데이터를 플랫 파일, 데이터베이스 및 이벤트 로그에 기록한다고 가정 해 보겠습니다. 다음 열거 형은이 간단한 프레임 워크에서 사용할 로그 대상을 정의합니다.

public enum LogTarget

    {

        File, Database, EventLog

    }

C # 로거 클래스

다음 단계는 클래스를 디자인하고 구현하는 것입니다. 우리는 세 가지, 즉 클래스를-사용 FileLogger, DBLogger그리고 EventLogger각각 파일, 데이터베이스 및 이벤트 로그에 데이터를 기록 -to. 이러한 모든 클래스는라는 추상 기본 클래스를 상속해야합니다 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, EventLoggerDBLogger- 추상 기본 클래스를 확장 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()각 로거 클래스 의 메서드 에서 lock 키워드를 사용하고 해당 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.

이 로깅 프레임 워크를 개선 할 수있는 여러 가지 방법이 있습니다. 많은 수의 메시지가 도착할 때 로거가 현재 스레드를 차단하지 않고도 이러한 메시지를 비동기 적으로 처리 할 수 ​​있도록 비동기 및 큐를 구현할 수 있습니다. 정보 메시지, 경고 메시지, 오류 메시지 등과 같은 메시지 중요도 수준을 구현할 수도 있습니다.