如何将log4net设置为从接口进行日志记录

本文关键字:接口 日志 记录 log4net 设置 | 更新日期: 2023-09-27 18:26:47

我使用log4net来记录应用程序中的事件/信息。我有一个接口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时,我没有得到任何日志条目。有没有人为接口编写了配置文件,或者知道如何克服这个问题?

如何将log4net设置为从接口进行日志记录

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>