Common.Logging for .NET을 사용하는 a project을 보면 어떤 클래스는 로거 인스턴스를 클래스 정적 멤버로 선언합니다. 예를 들어 :C#에서 내 Common.Logging 로거가 인스턴스 멤버 또는 정적이어야합니까?
public class SimpleExample : IExample
{
public virtual void Run()
{
ILog log = LogManager.GetLogger(typeof (SimpleExample));
log.Info("------- Initializing ----------------------");
// etc
}
}
하나의 방법 또는 기타를 선호하는 이유가 :
public class HelloJob : IJob
{
private static ILog _log = LogManager.GetLogger(typeof(HelloJob));
public HelloJob()
{
}
public virtual void Execute(IJobExecutionContext context)
{
_log.Info(string.Format("Hello World! - {0}", System.DateTime.Now.ToString("r")));
}
}
그리고 다른 클래스의
는 로거 인스턴스 멤버로 선언?각 경우에 어떤 접근 방식을 권장합니까? 스레드 안전과 관련이 있습니까?
정적 "로거"멤버가있는 "로거"클래스를 선언하고 전체 프로젝트에서 전역 변수가있는 문제를 제외하고이 클래스를 사용하면 문제가 발생합니까?
'LogManager.GetLogger'는 아마도 내부적으로 의존성 주입을 통해 구현됩니다. 즉, 종속성은 로거 내에서 관리됩니다. 내 로거가 "인스턴스 당 필드"로 저장되어 각 인스턴스에 대해 오버 헤드가 발생하는 것을 원하지 않습니다. 클래스를 처음로드 할 때 정적으로 저장하면 나를 위해 작동합니다. –
@ChrisSinclair : 인스턴스화 * 세부 사항 *이 LogManager.GetLogger에 의해 처리된다는 것은 사실입니다. Commons.Logging은 공통 로깅 인터페이스를 제공하므로 기본 프레임 워크, 구성 등을 자유롭게 전환 할 수 있습니다. 공장 패턴의 예, 종속성 삽입이 아닙니다. 팩토리 패턴은 수동 인스턴스화보다 많은 이점을 가지고 있지만, 종속성 삽입은 여전히 추가적인 이점을 가지고 있습니다. DI 프레임 워크는 각 유형별로 로거를 재사용하도록 설정할 수 있으며 오버 헤드는 사실상 측정 할 수없는 시간의 90 %입니다. – StriplingWarrior
Common.Logging 문서에 따르면 public static LogManagers는 스레드로부터 안전하지만 인스턴스 메서드는 없으므로이 대답에 어긋나게 보인다. http://netcommon.sourceforge.net/docs/2.0.0/api/html/Common.Logging-Common.Logging.LogManager.html – coderjoe