C# 如何将log4net设置为从接口登录
我正在使用log4net记录我的应用程序中的事件/信息。我有一个接口C# 如何将log4net设置为从接口登录,c#,.net,log4net,log4net-appender,C#,.net,Log4net,Log4net Appender,我正在使用log4net记录我的应用程序中的事件/信息。我有一个接口IReader,它至少由4个类实现,并且可以扩展。每个类都有一个ReadBuffer()方法,如果读取失败,我想在其中记录错误。以下是一个类的方法定义: public class IPortM350Connection : IReader { public void ReadBuffer() { try { this.AddToLog(iqBeaconLo
IReader
,它至少由4个类实现,并且可以扩展。每个类都有一个ReadBuffer()
方法,如果读取失败,我想在其中记录错误。以下是一个类的方法定义:
public class IPortM350Connection : IReader
{
public void ReadBuffer()
{
try
{
this.AddToLog(iqBeaconLogType.Info, string.Format("Reader# {0} start reading.", SerialNumber));
while (IsConnected)
{
if (IportM350Obj != null && IportM350Obj.DataStream.IsOpen)
{
var data = IportM350Obj.GetBeaconTags();
var rampTagList = Utility.Identec350TagToTag(data);
if (rampTagList != null && rampTagList.Any())
{
var e = new RampTagReadEventArg(rampTagList);
// trigger Successful Tag read event
ReadMessage(this, e);
}
}
}
}
catch (ReaderTimeoutException ex)
{
this.AddToLog(iqBeaconLogType.Fatal, string.Format("Reader# {0} failed reading.", SerialNumber));
}
}
}
AddToLog扩展方法负责创建日志,如下所示
public static void AddToLog(this object logObject, iqBeaconLogType logType, string message)
{
ILog log = LogManager.GetLogger(logObject.GetType());
var msg = string.Format("Event occured in : {0} at time {1}. Event Log : {2}",
logObject.GetType().ToString(),DateTime.Now.ToString(), message);
log.Fatal(msg);
}
当我将配置文件设置为读取类时,此方法工作正常,如下所示:
<logger name="iqBeaconv7_1.ReaderLayer.Connection.IPortM350Connection" additivity="False">
<level value="ALL"/>
<appender-ref ref="RollingFileCompositeAppenderForIPort350Connection"/>
</logger>
但是,我认为如果我能够将IReader接口传递给记录器,那么我就可以用同一个文件记录所有类。当我用
IReader
替换IPortM350Connection
时,没有日志条目。是否有人为接口编写了配置文件,或者知道如何克服此问题?您的AddToLog
方法正在创建一个记录器,其名称为派生类的名称(logObject.GetType()
)。您可能希望对所有派生类使用公共记录器,这些派生类的名称可以是硬连线的,也可以是接口的名称(IReader
)
我不完全确定我是否理解您试图实现的目标,但您可以尝试将AddToLog方法更改为:
public static void AddToLog(this IReader logObject, iqBeaconLogType logType, string message)
{
ILog log = LogManager.GetLogger(typeof(IReader));
...
}
以及您的log4net配置:
<logger name="iqBeaconv7_1.ReaderLayer.Connection.IReader" additivity="False">
...
</logger>
...
您的AddToLog
方法正在创建一个记录器,其名称为派生类的名称(logObject.GetType()
)。您可能希望对所有派生类使用公共记录器,这些派生类的名称可以是硬连线的,也可以是接口的名称(IReader
)
我不完全确定我是否理解您试图实现的目标,但您可以尝试将AddToLog方法更改为:
public static void AddToLog(this IReader logObject, iqBeaconLogType logType, string message)
{
ILog log = LogManager.GetLogger(typeof(IReader));
...
}
以及您的log4net配置:
<logger name="iqBeaconv7_1.ReaderLayer.Connection.IReader" additivity="False">
...
</logger>
...
您的AddToLog
方法正在创建一个记录器,其名称为派生类的名称(logObject.GetType()
)。您可能希望对所有派生类使用公共记录器,这些派生类的名称可以是硬连线的,也可以是接口的名称(IReader
)
我不完全确定我是否理解您试图实现的目标,但您可以尝试将AddToLog方法更改为:
public static void AddToLog(this IReader logObject, iqBeaconLogType logType, string message)
{
ILog log = LogManager.GetLogger(typeof(IReader));
...
}
以及您的log4net配置:
<logger name="iqBeaconv7_1.ReaderLayer.Connection.IReader" additivity="False">
...
</logger>
...
您的AddToLog
方法正在创建一个记录器,其名称为派生类的名称(logObject.GetType()
)。您可能希望对所有派生类使用公共记录器,这些派生类的名称可以是硬连线的,也可以是接口的名称(IReader
)
我不完全确定我是否理解您试图实现的目标,但您可以尝试将AddToLog方法更改为:
public static void AddToLog(this IReader logObject, iqBeaconLogType logType, string message)
{
ILog log = LogManager.GetLogger(typeof(IReader));
...
}
以及您的log4net配置:
<logger name="iqBeaconv7_1.ReaderLayer.Connection.IReader" additivity="False">
...
</logger>
...
嗨,乔,谢谢你的回答。我正在尝试创建一个公共记录器库,它可以用于任何类,如安装文件中配置的那样。我可以尝试传递IReader对象,但它会创建循环引用错误。我最终创建了一个不同的方法,仅用于IReader接口类,类似于您的方法,并使用logObject.GetType.GetInterface('IReader')将对象强制转换为IReader类型。嗨,Joe,谢谢您的回答。我正在尝试创建一个公共记录器库,它可以用于任何类,如安装文件中配置的那样。我可以尝试传递IReader对象,但它会创建循环引用错误。我最终创建了一个不同的方法,仅用于IReader接口类,类似于您的方法,并使用logObject.GetType.GetInterface('IReader')将对象强制转换为IReader类型。嗨,Joe,谢谢您的回答。我正在尝试创建一个公共记录器库,它可以用于任何类,如安装文件中配置的那样。我可以尝试传递IReader对象,但它会创建循环引用错误。我最终创建了一个不同的方法,仅用于IReader接口类,类似于您的方法,并使用logObject.GetType.GetInterface('IReader')将对象强制转换为IReader类型。嗨,Joe,谢谢您的回答。我正在尝试创建一个公共记录器库,它可以用于任何类,如安装文件中配置的那样。我可以尝试传递IReader对象,但它会创建循环引用错误。我最终创建了一个仅用于IReader接口类的不同方法,类似于您的方法,并使用logObject.GetType.GetInterface('IReader')将对象强制转换为IReader类型。