LogManager.GetLogger에 대한 log4net 인수
대부분의 log4net 예제는 다음을 수행하여 클래스에 대한 로거를 가져 오는 이유는 무엇입니까?
private static ILog logger =
LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
typeof (MyClass)를 전달하는 대신 :
private static ILog logger = LogManager.GetLogger(typeof(MyClass));
첫 번째 옵션에서 특정 클래스 이름을 입력 할 필요가 없다는 사실 외에 다른 이유가 있습니까?
이유가 있다고 생각합니다. 이렇게하면 클래스 이름에 대해 걱정할 필요없이 새 클래스에 상용구 코드를 복사하여 붙여 넣을 수 있습니다.
공식적인 대답은 다음을 참조하십시오. 정적 블록에서 클래스의 정규화 된 이름을 얻으려면 어떻게합니까? 상기 log4net 자주 묻는 질문
당신이 말했듯이-클래스의 이름을 몰라도 메소드에서 로거를 만들 수 있기 때문에 편리합니다 (내가 아는 사소한 일이지만) 호출 이름을 바꾸지 않고도 클래스간에 메소드를 잘라내어 붙여 넣을 수 있습니다.
저는 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에 대해 비슷한 것을 작성할 것이라고 생각합니다. :)
그 이유는 .DeclaringType()
메서드를 사용하여 런타임 유형의 유형을 가져 오기 때문이라고 생각합니다 . 기본 클래스에서 로거를 사용할 수 있으며 로거 출력에서 개체의 실제 유형을 볼 수 있습니다. 따라서 조사가 훨씬 더 편리해집니다.
참고 URL : https://stackoverflow.com/questions/680044/log4net-argument-to-logmanager-getlogger
'developer tip' 카테고리의 다른 글
javascript로 html을 생성하는 모범 사례가 있습니까? (0) | 2020.08.22 |
---|---|
Linux에서 C # 개발 (0) | 2020.08.22 |
여러 git 저장소를 어떻게 구성하여 모두 함께 백업합니까? (0) | 2020.08.22 |
문제 영역을 식별하기 위해 Python 코드를 분석하려면 어떻게해야합니까? (0) | 2020.08.22 |
Java에서 직렬화의 목적은 무엇입니까? (0) | 2020.08.21 |