2013-12-10 3 views
1

ILog에 대한 확장 기능이 있다고 가정 해 보겠습니다. 현재 내가 사용하는 로직에서 ILog 확장을 사용할 때 %method %location %class 속성이 내 확장 클래스의 속성으로 간주됩니다. 나는 tham이 내 비즈니스 논리를 되풀이하기를 바란다. log4net 속성에 ILog 확장을 숨기고 있습니까? 이 호출 된 곳에서 걱정하지 않을 LoggerExtensions Debug message 및 log4net : 같은 것을 반환이 <conversionPattern value="%type %method %m%n" /> 예를 들어log4net을 사용하여 로깅 체인의 메소드를 숨기는 방법은 무엇입니까?

using log4net; 

namespace Helpers { 
    public class MyObject {} 
    public static class LoggerExtensions { 
     public static void Debug(this ILog log, MyObject obj, string format, params object[] arguments) { 
      log.DebugFormat(format, arguments); 
     } 
    } 
} 

를 들어

.

log4net stackTrace inspector에 대해이 확장자를 투명하게 만들려면 몇 가지 속성이 필요합니다. 어떤 것을 만들지 또는 어떻게 만드나요?

+0

확장 프로그램 코드를 표시 할 수 있습니까? – stuartd

답변

2

당신이 (내가 이것을 테스트하기 위해 지금 시간이 없어 참고) 같은 것을 할 수 있어야 ...

using log4net; 

namespace Helpers 
{ 
    public class MyObject {} 
    public static class LoggerExtensions 
    { 
    public static void Debug(this ILog log, MyObject obj, string format, params object[] arguments) 
    { 
     if (!log.IsDebugEnabled) return; 

     log.Logger.Log(typeof(LoggerExtensions), LogLevel.Debug, string.Format(format, arguments)); 
    } 
    } 
} 

옳은 사이트가 기록 얻기에 열쇠 (즉, 어디 확장 메서드 자체가 아닌 확장 메서드를 호출하는 경우)는 "Log"메서드를 사용하여 로깅 확장이 구현 된 개체 유형을 전달합니다. Log4net은 Log에 전달 된 유형과 동일한 유형이 될 때까지 스택을 트래버스합니다. 일부는이 유형을 경계 유형이라고 부릅니다. 스택의 다음 항목은 로깅 코드가 아닌 "실제"코드의 실제 호출 사이트입니다.

또한 디버그 로깅이 활성화되어 있는지 확인하고 그렇지 않은 경우 일찌기 반환합니다. Log 메서드에는 인수를 인수로 사용하는 서명이 없으므로 Log를 호출하기 전에 메시지의 형식을 지정해야합니다. 실제로 기록되지 않는 한 메시지의 형식을 지정하는 데 비용을 지출하고 싶지 않습니다.

이전에 말했듯이이 방법은 테스트하지 않았지만이 기술은 log4net 로거 (예 : Common.Logging .Net)를 래핑하여 호출 사이트를 유지 관리 할 때 사용됩니다. 여기에 lot4net 래퍼 (또는 NLog 래퍼)를 찾으면 대다수가 호출 사이트가 유지되도록 작성되지 않으므로 조심하십시오. 확장 메서드 뒤에 log4net을 감싸거나 숨기려면 Debug, Info 등의 메소드에 위임 할 수 없습니다. 경계 유형을 전달할 수 있도록 Log 메소드를 사용해야합니다.

행운을 빈다.