我有一个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类来记录错误或信息等。
通过使用我的普通类(class),我习惯称其为
ErrorLogger log = new ErrorLogger();
log.Error(string.Concat("Exception Occurred :" + ex.Message, "/n", ex.StackTrace));
如果我使用单例类(class),该如何登录?
最佳答案
这是单例模式的正确实现。您可以使用以下语句调用方法进行记录:
ErrorLogger.Instance.Fatal(Exception);
请注意,此实现不是线程安全的,这意味着如果您使用多个线程来使用此记录器记录不同的消息,则可能会遇到一些意外的异常。您可以通过用锁将所有公共(public)方法包围起来,从而解决此问题。
例如:
private object _lock = new object();
public void Error(Object message)
{
lock(_lock){
logger.Error(message);
}
}
还请确保在类内的每个公共(public)方法上使用相同的锁对象。
关于c# - 如何使Log4Net包装器类成为单例类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15247988/