2014-10-17 64 views
0

我正在使用log4net從我的應用程序記錄事件/信息。我有一個接口IReader,它由至少4個類實現,並且可以增長。每個班級都有一個ReadBuffer()方法,如果讀取失敗,我想記錄錯誤。以下是一個類的方法定義:如何設置log4net從接口登錄

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> 

不過,我認爲如果我能留園接口傳遞到記錄儀,然後我可以用同一個文件記錄所有的類。當我將IPortM350Connection替換爲IReader時,我沒有獲得日誌條目。有沒有人爲接口編寫配置文件,或者有任何想法如何克服?

回答

3

您的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> 
+0

喜喬,謝謝你的回答。我正在嘗試創建一個可用於任何類的通用記錄器庫,如在安裝文件中配置的那樣。我可以嘗試傳遞IReader對象,但它會創建一個循環引用錯誤。我最終創建了一個用於IReader接口類的不同方法,類似於您的方法,並使用logObject.GetType.GetInterface('IReader')將對象轉換爲IReader類型。 – Purusartha 2014-10-18 04:34:56