3

私は log4net ラッパー クラスを持っています...しかし、エラーをログに記録するために他のクラスから呼び出すたびにインスタンス化する必要があります。私はそれを克服する必要があります..最近、私にはなじみのないシングルトンクラスに出くわしました..したがって、現在のラッパークラスをシングルトンクラスに変換する際に助けが必要です..

現在使用しているlog4netラッパークラスを以下に投稿しています..

using System;
using System.Data;
using System.Configuration;
using Asset.Business;

/// <summary>
/// Summary description for Logger
/// </summary>

namespace AssetsDataService
{
    public class ErrorLogger
    {
        private static log4net.ILog logger = null;
        public ErrorLogger()
        {
            if (logger == null)
            {

                string logConfigPath = ConfigSettings.GetEnvConfigValue("LogConfigXMLPath"); // this contains the path of the xml

                System.IO.FileInfo fileInfo = new System.IO.FileInfo(logConfigPath);
                log4net.Config.DOMConfigurator.Configure(fileInfo);

                string loggerName = ConfigurationManager.AppSettings.Get("ErrorLoggerName"); // this contains the name of the logger class

                logger = log4net.LogManager.GetLogger(loggerName);
            }

        }

        public void Fatal(Object message)
        {
            logger.Fatal(message);
        }

        public void Fatal(Object message, Exception exception)
        {
            logger.Fatal(message, exception);
        }

        public void Error(Object message)
        {
            logger.Error(message);
        }

        public void Error(Object message, Exception exception)
        {
            logger.Error(message, exception);

        }

        public void Debug(Object message)
        {

            logger.Debug(message);
        }

        public void Info(Object message)
        {
            logger.Info(message);
        }
    }
}

そして、これはラッパークラスをシングルトンにしようとしたコードです:

using System;
using System.Data;
using System.Configuration;
using Asset.Business;

/// <summary>
/// Summary description for Logger
/// </summary>

namespace AssetsDataService
{
    public class ErrorLogger
    {

        private static volatile ErrorLogger instance;
        private static object syncRoot = new Object();
         private static log4net.ILog logger = null;

        private ErrorLogger()
        {
            if (logger == null)
            {

                string logConfigPath = ConfigSettings.GetEnvConfigValue("LogConfigXMLPath"); // this contains the path of the xml

                System.IO.FileInfo fileInfo = new System.IO.FileInfo(logConfigPath);
                log4net.Config.DOMConfigurator.Configure(fileInfo);

                string loggerName = ConfigurationManager.AppSettings.Get("ErrorLoggerName"); // this contains the name of the logger class

                logger = log4net.LogManager.GetLogger(loggerName);
            }

        }

        public static ErrorLogger Instance()
        {

            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                        instance = new ErrorLogger();
                }
            }

            return instance;
         }


        public void Fatal(Object message)
        {
            logger.Fatal(message);
        }

        public void Fatal(Object message, Exception exception)
        {
            logger.Fatal(message, exception);
        }

        public void Error(Object message)
        {
            logger.Error(message);
        }

        public void Error(Object message, Exception exception)
        {
            logger.Error(message, exception);

        }

        public void Debug(Object message)
        {

            logger.Debug(message);
        }

        public void Info(Object message)
        {
            logger.Info(message);
        }
    }
}

このクラスは正しいシングルトン クラスであり、ロギングを正しく処理しますか?

エラーや情報などをログに記録するには、ロガーの ErrorLogger クラスをどのように呼び出しますか?

私の通常のクラスを使用して、私はそれを

ErrorLogger log = new ErrorLogger();
log.Error(string.Concat("Exception Occurred :" + ex.Message, "/n", ex.StackTrace));

シングルトン クラスを使用している場合、どのようにログに記録できますか??

4

1 に答える 1

2

これは、シングルトンパターンの正しい実装です。次のステートメントを使用して、メソッドを呼び出してログに記録できます。

ErrorLogger.Instance.Fatal(Exception);

この実装はスレッドセーフではないことに注意してください。つまり、複数のスレッドを使用してこのロガーでさまざまなメッセージをログに記録すると、予期しない例外が発生する可能性があります。すべてのパブリックメソッドをロックで囲むことにより、これをすばやく修正できます。

例えば:

private object _lock = new object();

public void Error(Object message)
{
    lock(_lock){
        logger.Error(message);
    }
}

また、クラス内のすべてのパブリックメソッドで同じロックオブジェクトを使用するようにしてください。

于 2013-03-06T13:52:02.263 に答える