2013-03-06 21 views
2

我有一个log4net包装类......但我需要每次从其他类调用它来记录错误时实例化。我需要克服这个..最近我遇到了单身人士班,这是我不熟悉..因此,我需要帮助,在转换我目前的包装类到单身人士班..如何将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)); 

我如何才能登录,如果我使用单身课程?

+1

你看过这个吗? http://msdn.microsoft.com/en-us/library/ff650316.aspx – Ramunas 2013-03-06 13:07:34

+1

一般来说,我会考虑实施IoC/DI。 Unity,Ninject,Autofac相当受欢迎,你应该能够找到大量的信息如何使用这些 – Ramunas 2013-03-06 13:11:01

+0

@Ramunas亚我已阅读...我的疑问是我将如何在其他类中调用记录器类如果我使它作为单身类 – Xavier 2013-03-06 13:11:59

回答

1

这是单例模式的正确实现。您可以调用方法登录以下语句:

ErrorLogger.Instance.Fatal(Exception); 

请注意,此实现不是线程安全的,这意味着如果你使用多个线程与此记录器记录不同的信息,你可能会得到一些意外的异常。你可以通过锁定你所有的公共方法来解决这个问题。

例如:

private object _lock = new object(); 

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

也确保您使用相同的锁定对象的类内的每个公共方法。

+0

谢谢你为澄清.. :) – Xavier 2013-03-06 14:12:12