2016-10-28 12 views
1

こんにちは、依存関係の注入にNinjectを使用するWeb 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 & 2を行うと、私はタイプのコントローラを作成しようとすると、エラー

エラーが発生し得る「ErrorCheckController」。コントローラにパラメータのないパブリックコンストラクタがあることを確認します。

第三の選択肢はロガーを取得しますが、それは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> 

EDIT 2 IでありますGetメソッドを変更しました

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(); 
    } 

これは私にエラー

一致するバインディングが用意されていない、とタイプが自己バインド可能ではありませんを提供します。

何もILoggerにバインドされていないようです。

編集3

私は戻って私の設定ファイルを見ていると私は黙って失敗するNLogを伝えていたことに気づきました。私はこれをオフにし、今私は適切なエラーを取得しています。 NLog.Targetsにプロパティ「レイアウト」を設定する際にエラー:私はエラー

例外を取得し、私の

に問題があるようです。DatabaseParameterInfo

内部例外:LayoutRendererが見つからない「のAppSetting」

私はこれは私が

をのAppSettingのドキュメントにある同じ構文を使用しています見つけることができない理由は、あまりにもわからないんだけど

答えて

1

問題は、私は

NLog.ILogger

代わりの

Ninject.Extensions.Logging.ILogger

を注入しようとしていたということになりました

それは今働いています。

1

コントローラにパラメータのないパブリックコンストラクタがあることを確認してください。あなたがそこにあるので、あなたの設定にエラー

がありNinject

  • に明示的にコントローラを設定しなかった

    1. :ので、あなたは、このエラーが出る理由がある

  • コントローラの明示的な登録がない場合、Ninjectはそれを作成しようとしますが、設定に問題があるので、null(これはIDependencyResolver契約)。

    すべてのコントローラを明示的に登録すると(コンテナにすべてのルートタイプを明示的に登録する必要があります)、Ninjectは設定エラーが何であるかを明示的に例外として通知します。すべてのルートタイプを明示的に登録することで、test your DI configurationも可能です。

    +0

    こんにちは、私はあなたに従っているかわかりません、.Netでデフォルトで作成されたパラメータのないコンストラクタではありませんか?私は他のプロジェクトでもNinjectを使用していましたが、明示的にコントローラを設定する必要はありませんでしたが、私はそれを調べます。元の質問に設定ファイルを追加しました。ありがとう –

    +1

    @JeffFinn 'Bind ()。AsSelf()'を使って 'ErrorCheckController'を登録してください。私たちはあなたがこれを試した後でこの議論を続けるでしょう:) – Steven

    +0

    Thanks @スティーブン私はコントローラを縛り、以前の手順をやり直しました。私はまだ同じエラーが発生しています –

    関連する問題