2014-10-17 2 views
0

log4net을 사용하여 응용 프로그램에서 이벤트/정보를 기록하고 있습니다. 적어도 4 클래스에 의해 구현 된 인터페이스 IReader 있고 성장할 수 있습니다. 각 클래스는 읽기가 실패한 경우 오류를 기록하려는 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> 

을, 나는 생각 나는 그 때, 로거에 IReader 인터페이스를 통과 할 수 있어요 경우 I 동일한 파일로 모든 클래스를 로그 할 수 있습니다. IPortM350ConnectionIReader으로 바꿀 때 로그 항목이 없습니다. 누구나 인터페이스에 대한 설정 파일을 작성했거나이를 극복하는 방법을 알고 있습니까?

답변

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