C#で簡単なロガーを実装する方法

.Netアプリケーションで発生したイベントやエラーをログに記録したい場合がよくあります。これを行うには、利用可能な多くの一般的なロギングフレームワークの1つを利用するか、独自のロギングフレームワークを設計および開発することができます。この記事では、独自のロギングフレームワークを簡単に設計および開発する方法を確認し、C#で単純なロガーを構築する手順を説明します。

まず、ログターゲット(データをログに記録できるさまざまな場所)を理解する必要があります。データをフラットファイル、データベース、およびイベントログに記録するとします。次の列挙は、この単純なフレームワークで使用するログターゲットを定義します。

public enum LogTarget

    {

        File, Database, EventLog

    }

C#ロガークラス

次のステップは、クラスを設計して実装することです。私たちは、3つの異なる、すなわちクラス-、使用されますFileLoggerDBLoggerと、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クラスを不完全なままにしました。メッセージをデータベースに記録するための適切なコードを入力するのはあなたに任せます。

-あなたは、クラスの3つのすべてを見ることができるようにFileLoggerEventLoggerDBLogger-抽象基本クラスを拡張します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です。

このロギングフレームワークを改善する方法はたくさんあります。非同期とキューを実装して、多数のメッセージが到着したときに、ロガーが現在のスレッドをブロックすることなくこれらのメッセージを非同期に処理できるようにすることができます。情報メッセージ、警告メッセージ、エラーメッセージなどのメッセージ重要度レベルを実装することもできます。