2014-12-12 1 views
0

저는 C#, .NET Framework 4.0, Ninject 3.2.2.0 및 log4net 2.0.3으로 웹 API 응용 프로그램을 개발하고 있습니다.Ninject를 사용하여 새로운 log4net 로거를 선언하십시오.

이제는 하나의 로거 만 사용합니다. 이것은 NinjectConfigurator 클래스에있는 경우 구성하는 방법입니다.

private void ConfigureLog4net(IKernel container) 
{ 
    log4net.Config.XmlConfigurator.Configure(); 
    var loggerForWebSite = LogManager.GetLogger("AutomationMiddlewareWebsite"); 
    container.Bind<ILog>().ToConstant(loggerForWebSite); 
} 

그러나 다른 로거를 사용해야합니다. Ninject를 사용하면 어떻게 할 수 있습니까?NinjectConfigurator 클래스에이 새로운 로거를 선언하는 방법을 모르겠습니다.

다른 로거를 선언하면 ILog을 사용하여이를 새 로거에 바인딩 할 수 없습니다. 어쩌면 매개 변수로 바인딩 할 수 있습니다 ...

이것은 Web.config에 내 log4net 구성입니다.

<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <file value="d:\\MyProject.Web.Api.log" /> 
     <appendToFile value="true" /> 
     <rollingStyle value="Date" /> 
     <datePattern value=".yyyyMMdd.lo\g" /> 
     <maximumFileSize value="5MB" /> 
     <maxSizeRollBackups value="-1" /> 
     <countDirection value="1" /> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" /> 
     </layout> 
    </appender> 
    <logger name="MyProjectWebsite"> 
     <level value="DEBUG" /> 
    </logger> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="RollingLogFileAppender" /> 
    </root> 
    </log4net> 

답변

3

여러 로거 .ToConstant(...)을 결합 수와 .WhenInjectedInto<SomeClass>() 같은 Contextual Binding facilities을 사용합니다.

Bind<Ilog>().ToConstant(logger1) 
    .WhenInjectedInto<Class1>(); 

하지만 작업량이 많고 유지 관리가 쉽지 않은 많은 클래스에 로거를 주입해야하는 경우. 이 경우

그렇게처럼 ToMethod(..) 바인딩을 사용하거나 provider을 사용하고 상황에 따라 로거를 생성하도록 선택할 수 있습니다 :

Bind<ILog>().ToMethod(context => 
       LogManager.GetLogger(context.Request.ParentContext.Plan.Type)); 

(context.Request.ParentContext.Plan.Type가 주입되는 유형 ILog입니다)

물론 정교한 체계를 사용하여 클래스 이름, 클래스 어셈블리, 클래스 네임 스페이스 등에 따라 사용할 로거를 결정할 수 있습니다.

하나 또는 두 개의 특정 로거가 필요한 경우 문맥 바인딩 (When(...)) 접근 방식을 사용할 수 있으며 그 이상인 경우 ToMethod(...) 또는 IProvider 접근 방식을 사용할 수 있습니다.

관련 문제