2009-07-19 7 views
9

Log4.netLog4net과 함께 래퍼 클래스를 사용할 때 메서드 이름을 기록하는 방법

public class ISDSApplicationEventsLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(...) 
    { 
     //Location Info 
     writer.WriteStartElement("Method"); 
     writer.WriteString(**loggingEvent.LocationInformation.MethodName * *); 
     writer.WriteEndElement(); 
    } 
} 

에 대한 사용자 지정 XML 포맷터를 구현하고 있습니다. 문제는 ... 이제 로그 래퍼 클래스에서 로그 메서드를 호출 할 때 ... 로깅이라는

public static void logEvent(string message) 
{ 
    log.Info(isdsLog); 
} 

출력 ....

 <Method>logEvent</Method> 

메소드 이름으로 logEvent 대신 logEvent를 호출 한 메소드 이름을 가질 수있는 방법은 무엇입니까?

질문 업데이트 :

위의 내용이 약간 복잡해 보이는 경우 - 실제로 묻는 것은 : 어떻게 래핑 로깅 함수를 호출 한 메서드의 컨텍스트를 유지합니까? log4net ...

예제 ... 메소드 doWork() ... 호출 -> 로깅 래퍼 -> log4net ....

어떻게 호출합니까? ....

+0

[래퍼를 사용할 때 Log4Net의 로그 및 클래스 이름을 유지하는 방법?] (http : // stackoverflow.com/questions/2049992/when-using-wrapper-how-to-log4-to-log에 대한 클래스 및 메소드 이름 유지) –

답변

14

실제로이 기능은 즉시 사용 가능한 log4net을 사용하여 쉽게 수정할 수 있습니다. 래퍼는 Logger.Log를 호출하고 래퍼 클래스의 유형을 첫 번째 매개 변수로 전달할 수 있습니다. 그것은 누구의 유형을 선언하는 첫 번째 매개 변수로 전달 형태와 동일한 방법에 도달 할 때까지

public class MyLog4NetWrapper 
{ 
    ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs"); 

    public void logEvent(string message) 
    {  
    log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null); 
    } 
} 

log4net는 메시지를 기록

, 그것은 호출 스택을 통과 : 그래서, 래퍼는 다음과 같이 보일 수 있습니다 Log 메소드. 스택의 다음 방법은 실제 호출 사이트입니다.

log4net 로거를 래핑하는 한 정적 래퍼 클래스를 만드는 것이 좋습니다. 주요 문제점은 app.config 파일에 구성 가능한 단일 로거 만있을 수 있다는 것입니다. 즉, 코드의 다른 부분에서 로깅을 독립적으로 제어 할 수 없습니다. A 클래스와 B 클래스가 있고 둘 다 정적 랩 랩퍼를 사용하는 경우 두 클래스 모두 동일한 레벨에서 로깅됩니다. 클래스 A에 대해 로그온하고 클래스 B에 대해 로그온하지 않으려면 그렇게 할 수 없습니다.

+0

물론, 때로는 얼굴을 보며 쳐다 보는 것이 보이지 않는 경우가 있습니다. 글쎄, 만약 당신이'log.Logger.Log (...)'코드를 수정했다면 적어도 :) –

+0

예, 맞습니다! 코드 샘플을 수정하겠습니다. – wageoghe

1

나는 당신이 out-of-the-box log4net으로 이것을 쉽게 고칠 수 있다고 생각하지 않는다.

메시지가 기록됩니다
virtual public void Info(object message) 
    { 
     Logger.Log(ThisDeclaringType, m_levelInfo, message, null); 
    } 

는 log4net을 위해 현재 통화의 스택 트레이스를 걷는 것을 시작하는 방법을 찾기 위해 : 우리는 당신이 요구하고 the LogImpl class의 ILog.Info 방법을 살펴 걸릴 경우 로그 작업. 이렇게하기 위해 Log4net은 "ThisDeclaringType"유형을 검색의 경계로 사용하며, 그 유형 내의 첫 번째 호출 "위"호출이 시작 메소드로 선택됩니다.

첫 번째 방법은 logEvent 메소드입니다. logEvent 랩퍼를 제거하고 로깅 메소드를 직접 사용하면 원하는 정보를 얻을 수 있습니다.

+0

실제로 호출을 성공적으로 보존 할 수있는 로거 래퍼를 만들 수 있습니다 사이트 정보. 이렇게하려면 한 가지 방법에 대한 내 대답 코드 샘플을 참조하십시오. 열쇠는 래핑 된 로거의 유형을 첫 번째 매개 변수로 Log 메소드에 전달하는 것입니다 (Info, Debug 등의 메소드를 사용하는 것이 아니라). – wageoghe

관련 문제