2009-08-21 4 views
4

로깅 프레임 워크를 필요로하는 클래스에 주입해야합니까? 아니면 필요한 모든 클래스가 프레임 워크를 알고 직접 사용해야합니까? Log4Net을 사용하고 있으며 현재 로그 할 수 있어야하는 클래스에 해당 프레임 워크를 래핑하는 서비스를 주입하고 있습니다. 로깅이 변경되지 않을 것이며 대부분의 조각이 필요하다는 것을 알고 이러한 의미에서 대답을 주입하고 있습니까? 당신이 등,로깅 프레임 워크를 클래스에 주입

답변

3

주입, 장기적으로 더 유연하다. 성능상의 이유로 정적 변수를 사용하는 것이 좋지만, 시작과 동시에 로거를 주입하는 것과 약간의 차이가 있음을 알 수 있습니다.

2

나는 그것을 주입 아무 문제가 없다고 생각을 쉽게 선택적으로 특정 장소에 주입 선택적으로 로깅을 사용하지 않도록 할 수 있기 때문에

1

메모리 성능이 그리 큰 문제가 아니라면 AOP를 고려해보십시오. PostSharp을 사용하십시오. 그런 식으로 수업은 로거를 전혀 알 필요가 없습니다. 기본적으로 IL 빌드 코드를 어셈블리 빌드 단계로 주입합니다. PostSharp는 메서드, 클래스 및 전체 어셈블리 마킹에 특성을 사용합니다. 로깅 문제로 log4net을 사용하기까지는 plugin입니다.

편집 : 각 속성을 사용하여 각 조인 포인트에 대해 새 객체를 만들기 때문에 메모리에 대해 언급했습니다.

+0

+1 PostSharp의 경우 그 마술은 –

1

로깅이 변경되지 않는다고 말했지만 특정 로깅 프레임 워크에서 추상화하는 것이 좋습니다. 그러나 모든 경우에 로거 인스턴스 삽입은 필요하지 않습니다.

CommonLogging (예 : Common.Logging에 대한 간략한 설명은 this Stackoverflow answer을 참조하십시오.) 클래스는 공장 (LoggerManager)과 직접 대화하지만 특정 로거 구현에 구속되지 않습니다.

0

당신이 의존성 주입 (Spring.NET 의미에서 말하고있는 것)에 대해 이야기하고 있다면, 로거 인스턴스의 여러 사본에서 많은 가치를 얻지는 않지만 그다지 중요하지 않습니다. 일반적으로 특정 클래스/이름이있는 프레임 워크에서 반환 된 각 로거 인스턴스는 싱글 톤이되므로 클래스 당 하나의 정적 참조가 아닌 로거 참조로 각 인스턴스를 복잡하게 처리할지 여부는 질문입니다. 로거 구현 변경에 관심이 있다면 인터페이스 (CommonLogging, 다른 대답에서 언급 한대로)에 로그온하여 log4net 및 Enterprise Library 구현을 모두 지원하십시오.

AOP를 사용한 주사에 대해 이야기하고 있다면 특정 시점을 넘어 AOP 주입이 더 유연하다는 것을 확신하지 못합니다. 메소드 레벨 세분성을 가진 엔트리, 종료 및 예외를 로깅하는 데 거의 제한이 있습니다. AOP를 사용하면 코드 일부에 선택적으로 주입하는 경우에도 AOP 삽입은 분산 형 접근 방식에 가깝습니다. 로깅은 AOP에 이상적인 종류의 크로스 커팅 (cross-cutting) 문제로 선전되었지만 실제로는 AOP 기반 로깅이 실제로 많이 사용되는 것을 발견하지 못했습니다 (물론 YMMV).

0

CSharpAtl,

내가 어떻게 Log4net을 정확하게에 호기심을 주입하는 건가요? 내 질문/커뮤니티 위키 here을 참조하십시오.

또한 DI/Log4net 질문 here에 대한 귀하의 답을 보았습니다.

나는 "로거"를 갖는 클래스가 주입 보여 본

대부분의 로깅 주입 예,이 같은 :

public class Foo 
{ 
    private ILogger logger; 

    public Foo(ILogger logger) //Injection via constructor 
    { 
    //Which "named" logger is this anyway? Is it Foo's? If so, how is it Foo's? 
    this.logger = logger; 
    } 

    public DoSomeWork(int xyz) 
    { 
    logger.Info("xyz = {0}", xyz); 
    } 
} 

Log4net (및 NLog, 아마 다른 사람)과 같은, 당신은 일반적으로 만들 logger like this :

public class Foo 
{ 
    private static ILogger logger = 
      LogManager.GetLogger(
       System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    public Foo() 
    { 
    } 

    public DoSomeWork(int xyz) 
    { 
    logger.Info("xyz = {0}", xyz); 
    } 
} 

따라서 의존성 삽입시 내 수업 Foo가 올바른 로거를 얻는 방법은 무엇입니까? 또한 어쩌면 클래스에 기반하여 로거 이름을 지정하지 않을 수도 있습니다. 오히려 유형에서 파생 될 수없는 기능 영역 (예 : "DatabaseAccess", "AppStartup", "AppShutdown"등)을 기반으로 이름을 지정할 수 있습니다.

"Logger"(명명 된 로거에 해당) 또는 "LogManager"(Log4net의 LogManager에 해당)를 주입하고 있습니까? 아니면 다른 작업을하고 있습니까? DI 플랫폼의 구성 기능을 사용하여 주입 된 종속성의 "명명 된 인스턴스"를 연관 시키십니까? 나는 정말로 확신하지는 않지만 유니티는 이와 비슷한 것을 지원한다고 생각합니다.

public class Foo 
{ 
    private static ILogger logger; 

    public Foo(ILogManager logManager) //Injection via constructor 
    { 
    logger = logManager.GetLogger 
        (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 

    //Since logger is (should it be?) static, maybe should be like this: 

    if (logger = null) 
    { 
     logManager.GetLogger 
       (System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
    } 
    } 

    public DoSomeWork(int xyz) 
    { 
    logger.Info("xyz = {0}", xyz); 
    } 
} 

ILogManager (Log4net의 LogManager의 포장 것이다의 구현) 같은 것을 주입하는 ILogger입니다을 injectng 더 쉽게 될 것이라고 나에게 보인다 여기

내가 일 것 "LogManager의"를 주입 상상하는 방법이다 왜냐하면 DI 플랫폼이 어떤 ILogger를 주입 하는지를 알 수있는 방법의 문제 때문입니다.

저는 DI 및 .NET 로깅 플랫폼에 익숙하지 않습니다. (사실 C# 및 .NET에 일반적으로 익숙하지 않습니다.) 지난 몇 년 동안 내 경험의 대부분은 좀 더 SO에 주위를 둘러 보았다 한

... 편집 시작 ... 모든 정보를 VB6 + VC++ 6

감사입니다 AutoFac에 관해서도 물어 보았습니다. 그래서 당신이 당신의 DI를 위해 이것을 사용하고 있다고 생각합니다. 그렇다면 this 또는 this과 같이 (클래스 유형별로) 로거를 해결하는 것과 같은 것을 수행하고있는 것 같습니다. 적어도 AutoFac에서는 Log4Net 또는 NLog와 같은 명명 된 로거를 주입하는 방법에 대한 질문에 답합니다.

끝 편집 ...

관련 문제