2016-10-28 9 views
1

안녕하세요, Ninject를 종속성 주입에 사용하는 웹 API 2 응용 프로그램과 함께 NLog를 사용하려고합니다.Ninject 및 Ninject.Extensions.Logging을 사용하여 ILogger에 NLog를 바인딩하는 방법

지금까지 NLog에 NuGet 패키지를 설치 한 방법에 대한 구체적인 정보를 찾기 위해 고심했습니다. & NLog.Configuration. 지금까지 내가 읽었던 것은 논문 패키지가 단지 작동하고 나를 묶어 둘 것임을 암시합니다.

Nlog.config 파일을 설정 한 다음 Ninject.Extensions.Logging & Ninject.Extensions.NLog4 패키지를 설치했습니다.

내가

  1. 을 시도 내 NinjectWebCommon에서

    public class ErrorCheckController : ApiController 
    { 
        private readonly ILogger _logger; 
    
        public ErrorCheckController(ILogger logger) 
        { 
         _logger = logger; 
        } 
    
        public IHttpActionResult Get(string version) 
        { 
         try 
         { 
          throw new Exception("Manually thrown exception"); 
         } 
         catch (Exception ex) 
         { 
          _logger.Debug(ex); 
         } 
    
         return Ok(); 
        } 
    } 
    

    을 다음과 같이 NLog를 사용하려고 해요 아니 MyLogger는을이다 kernel.Bind<ILogger>().To<Logger>();

  2. kernel.Bind<ILogger>().ToMethod(lm => LogManager.GetLogger("MyLogger"));와 바인딩과 바인딩
  3. 바인딩 타겟 구성의 이름
나는 1 &이 작업을 수행 할 때 16,

나는 형태의 컨트롤러의 ErrorCheckController '을 만들려고 할 때 오류가 발생했습니다

오류를 얻을. 컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오.

제 3의 옵션은 로거를 얻을 수 있지만 NLog.config가

EDIT 파일 사용하여 구성되지 않은 여기 내 설정 파일

<?xml version="1.0" encoding="utf-8" ?> 
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" 
    autoReload="true" 
    throwExceptions="false"> 

    <targets> 
    <target xsi:type="Database" name="Ink3DPowderDbLogger" connectionStringName="MyDbContext"> 
     <commandText> 
     INSERT INTO Log.ApiLog (
    Application, 
    Logger, 
    Logged, 
    Level, 
    Environment, 
    Request, 
    Message, 
    BaseDir, 
    Message, 
    CallSite, 
    CallSiteLn, 
    Exception, 
    EventProperties, 
    StackTrace, 
    ServerName, 
    Port, 
    Url, 
    Https, 
    ServerAddress, 
    RemoteAddress, 
    ) VALUES (
    @Application, 
    @Logger, 
    @Logged, 
    @Level, 
    @Environment, 
    @Request, 
    @BaseDir, 
    @Message, 
    @CallSite, 
    @CallSiteLine, 
    @Exception, 
    @EventProperties, 
    @StackTrace, 
    @ServerName, 
    @Port, 
    @Url, 
    @Https, 
    @ServerAddress, 
    @RemoteAddress, 
    ); 
    </commandText> 

    <parameter name="@application" layout="${appsetting:name=AppName:default=Unknown}" /> 
    <parameter name="@logger" layout="${logger}" /> 
    <parameter name="@logged" layout="${date}" /> 
    <parameter name="@level" layout="${level}" /> 
    <parameter name="@environment" layout="${environment}" /> 
    <parameter name="@request" layout="${asp-request}" /> 
    <parameter name="@basedir" layout="${basedir}" /> 
    <parameter name="@message" layout="${message}" /> 
    <parameter name="@callSite" layout="${callsite}" /> 
    <parameter name="@callSiteLine" layout="${callsite-linenumber}" /> 
    <parameter name="@exception" layout="${exception:tostring}" /> 
    <parameter name="@eventproperties" layout="${eventproperties:tostring}" /> 
    <parameter name="@stacktrace" layout="${stacktrace:tostring}" /> 
    <parameter name="@serverName" layout="${aspnet-request:serverVariable=SERVER_NAME}" /> 
    <parameter name="@port" layout="${aspnet-request:serverVariable=SERVER_PORT}" /> 
    <parameter name="@url" layout="${aspnet-request:serverVariable=HTTP_URL}" /> 
    <parameter name="@https" layout="${when:inner=1:when='${aspnet-request:serverVariable=HTTPS}' == 'on'}${when:inner=0:when='${aspnet-request:serverVariable=HTTPS}' != 'on'}" /> 
    <parameter name="@serverAddress" layout="${aspnet-request:serverVariable=LOCAL_ADDR}" /> 
    <parameter name="@remoteAddress" layout="${aspnet-request:serverVariable=REMOTE_ADDR}:${aspnet-request:serverVariable=REMOTE_PORT}" /> 

</target> 

    </targets> 

    <rules> 
    <logger name="*" minlevel="Info" writeTo="Ink3DPowderDbLogger" /> 
    </rules> 
</nlog> 

편집 2 I입니다 Get Method를 변경했습니다.

public IHttpActionResult Get(string version) 
    { 
     IKernel kernel = new StandardKernel(); 
     //var resolver = new NinjectDependencyResolver(kernel); 
     //var logger = (ILogger) resolver.GetService(typeof(ILogger)); 
     var logger = kernel.Get<ILogger>(); 

     try 
     { 
      throw new Exception("Manually thrown exception"); 
     } 
     catch (Exception ex) 
     { 
      //_logger.Debug(ex); 
      logger.Debug(ex); 
     } 

     return Ok(); 
    } 
이것은 나에게

일치하는 바인딩을 사용할 수없는 오류를 제공하고, 유형 자기 바인딩하지 않습니다 (210)

.

ILogger에 아무것도 바인딩되어 있지 않은 것 같습니다.

편집 3

나는 다시 내 설정 파일을 통해 찾고 내가 자동으로 실패 할 NLog 말씀하신 것을 발견했습니다. 나는 이것을 꺼 버렸고 이제는 적절한 오류가 발생합니다. NLog.Targets에 재산 '레이아웃'을 설정할 때 오류 : 나는 오류

예외가 내

에 문제가있는 것 같습니다.DatabaseParameterInfo

내부 예외 : LayoutRenderer 찾을 수 없습니다 : 'appsetting'

나는 이것이 내가

을 appsetting에 대한 문서에 동일한 구문을 사용하고 찾을 수없는 이유도 확실하지 않다

답변

1

문제는 내가

NLog.ILogger

대신

Ninject.Extensions.Logging.ILogger

을 주입하려고했던 것이 었죠

지금 작동 중입니다.

1

컨트롤러에 매개 변수없는 public 생성자가 있는지 확인하십시오.

이 오류가 이유가 있기 때문이다 있기 때문에 명시 적으로 Ninject에에서 컨트롤러를 구성하지 않은

  1. 은 구성

에 오류가 있습니다 컨트롤러에 대한 명시 적 등록이 없으면 Ninject가 자동으로 컨트롤러를 만들려고 시도하지만 구성에 문제가 있으므로 null (IDependencyResolver 계약).

모든 컨트롤러를 명시 적으로 등록한 경우 (항상 모든 루트 유형을 컨테이너에 명시 적으로 등록해야 함) Ninject는 구성 오류가 무엇인지 설명하는 표현적인 예외를 throw합니다. 모든 루트 유형을 명시 적으로 등록하면 test your DI configuration도 가능합니다.

+0

안녕하세요, 저는 여러분을 따르고 있는지, 매개 변수가없는 생성자가 기본적으로 .Net에 만들어지지 않았는지 잘 모르겠습니까? 나는 또한 다른 프로젝트에서 Ninject를 사용 해왔고 컨트롤러를 명시 적으로 구성하지 않아도되었지만 살펴 보았습니다. 구성 파일을 원래 질문에 추가했습니다. Thanks –

+1

@JeffFinn Bind (). AsSelf()'를 사용하여'ErrorCheckController'를 등록하십시오. 이것을 시도한 후에이 토론을 계속할 것입니다. :) – Steven

+0

Thanks @Steven 컨트롤러를 연결하고 이전 단계를 다시 시도했습니다. –