LogManager.GetLogger에 대한 log4net 인수


98

대부분의 log4net 예제는 다음을 수행하여 클래스에 대한 로거를 가져 오는 이유는 무엇입니까?

private static ILog logger = 
    LogManager.GetLogger(
    System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

typeof (MyClass)를 전달하는 대신 :

private static ILog logger = LogManager.GetLogger(typeof(MyClass));

첫 번째 옵션에서 특정 클래스 이름을 입력 할 필요가 없다는 사실 외에 다른 이유가 있습니까?

답변:


93

이유가 있다고 생각합니다. 이렇게하면 클래스 이름에 대해 걱정할 필요없이 새 클래스에 상용구 코드를 복사하여 붙여 넣을 수 있습니다.

공식적인 대답은 다음을 참조하십시오. 정적 블록에서 클래스의 정규화 된 이름을 얻으려면 어떻게합니까? 상기 log4net 자주 묻는 질문


알겠습니다. 링크 감사합니다. 이전에는 본 적이 없었습니다
Andy White

이것은 얻는만큼 오래되었지만 보일러 코드로 붙여 넣는 경우 내 대답을 살펴보십시오. :)
Noctis

이 코드를 잘라내어 붙여 넣는 데 약간의 개발 시간을 절약 할 수 있습니다. 그러나 문자열 상수를 사용하거나 'typeof ()'를 호출하는 것과 달리 'GetCurrentMethod ()'를 호출하는 데는 비용이 듭니다. 클래스 이름을 입력하는 데 걸리는 시간과 비교하여 코드 수명 동안 호출되는 횟수를 더하면 거의 이익을 위해 코드 속도를 늦추는 것 같습니다.
Youngs

1
생각만큼 느려지지 않습니다. 이것은 정적 호출이므로 앱 도메인 당 클래스 당 하나의 호출이 있습니다. 예를 들어 300 개의 클래스가있는 경우 앱 수명 동안 최대 300 번의 호출이 있습니다.
Paul 해쳐

리플렉션을 사용하여 유형 이름을 얻을 필요가 없으며 복사 / 과거가 게으름이고 성능이 저하되었으므로 이름 만 가져 오는 것은 어떻습니까?!
MeTitus 2017

8

저는 NLog 사용자이며 일반적으로 다음과 같이 요약됩니다.

var _logger = LogManager.GetCurrentClassLogger();

Log4Net에서 리플렉션을 거쳐야한다는 것이 조금 이상해 보였기 때문에 NLog 소스 코드를 살펴 보았습니다. 그리고 보라, 이것이 그들이 당신을 위해하는 일입니다.

[MethodImpl(MethodImplOptions.NoInlining)]
public static Logger GetCurrentClassLogger()
{
    string loggerName;
    Type declaringType;
    int framesToSkip = 1;
    do
    {
#if SILVERLIGHT
        StackFrame frame = new StackTrace().GetFrame(framesToSkip);
#else
        StackFrame frame = new StackFrame(framesToSkip, false);
#endif
        var method = frame.GetMethod();
        declaringType = method.DeclaringType;
        if (declaringType == null)
        {
            loggerName = method.Name;
            break;
        }
        framesToSkip++;
        loggerName = declaringType.FullName;
    } while (declaringType.Module.Name.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase));
    return globalFactory.GetLogger(loggerName);
}

내 보일러 코드의 일부로 리플렉션을 붙여 넣는 대신 확장 또는 정적 메서드로 Log4Net에 대해 비슷한 것을 작성할 것이라고 생각합니다. :)


7

당신이 말했듯이-클래스의 이름을 몰라도 메소드에서 로거를 만들 수 있기 때문에 편리하지만 (내가 아는 사소한), 호출 이름을 바꿀 필요없이 클래스간에 메소드를 잘라내어 붙여 넣을 수 있습니다.


3

그 이유는 .DeclaringType()메서드를 사용하여 런타임 유형의 유형을 가져 오기 때문이라고 생각합니다 . 기본 클래스에서 로거를 사용할 수 있으며 로거 출력에서 ​​개체의 실제 유형을 볼 수 있습니다. 따라서 조사가 훨씬 더 편리해집니다.


0

또한 코드 생성 목적으로 코드 스미스 템플릿을 더 쉽게 만들 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.