こんにちは、依存関係の注入にNinjectを使用するWeb Api 2アプリケーションでNLogを使用しようとしています。NinjectとNinject.Extensions.Loggingを使用してILoggerにNLogをバインドする方法
NLogのNuGetパッケージをNLog.Configurationにインストールしたことがありましたかどうか、具体的な情報を探すのに苦労しました。これまで私が読んだことは、これらのパッケージはちょうどうまく動作し、私のためのバインディングを世話するべきであることを示唆しています。
Nlog.configファイルをセットアップしてから、Ninject.Extensions.Logging & Ninject.Extensions.NLog4パッケージをインストールしました。
私は
- を試してみましたが、私の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>();
- が
kernel.Bind<ILogger>().ToMethod(lm => LogManager.GetLogger("MyLogger"));
との結合との結合 - バインディングターゲット構成名
私は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のドキュメントにある同じ構文を使用しています見つけることができない理由は、あまりにもわからないんだけど
こんにちは、私はあなたに従っているかわかりません、.Netでデフォルトで作成されたパラメータのないコンストラクタではありませんか?私は他のプロジェクトでもNinjectを使用していましたが、明示的にコントローラを設定する必要はありませんでしたが、私はそれを調べます。元の質問に設定ファイルを追加しました。ありがとう –
@JeffFinn 'Bind()。AsSelf()'を使って 'ErrorCheckController'を登録してください。私たちはあなたがこれを試した後でこの議論を続けるでしょう:) –
Steven
Thanks @スティーブン私はコントローラを縛り、以前の手順をやり直しました。私はまだ同じエラーが発生しています –