NLog 如何使用 Ninject & Ninject.Extensions.Logging 绑定到 ILogger
How is NLog binded to ILogger with Ninject & Ninject.Extensions.Logging
您好,我正在尝试将 NLog 与 Web Api 2 应用程序一起使用,该应用程序使用 Ninject 进行依赖注入。
到目前为止,我一直在努力寻找有关如何执行此操作的任何具体信息,我已经为 NLog 和 NLog.Configuration 安装了 NuGet 包。到目前为止,我所读到的内容表明这些包应该可以正常工作并为我处理绑定。
我设置了 Nlog.config 文件,然后我安装了 Ninject.Extensions.Logging & Ninject.Extensions.NLog4 包。
我正尝试按如下方式使用 NLog
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();
}
}
在我的 NinjectWebCommon 我试过了
- 无绑定
- 绑定
kernel.Bind<ILogger>().To<Logger>();
- 与
kernel.Bind<ILogger>().ToMethod(lm => LogManager.GetLogger("MyLogger"));
绑定,其中 MyLogger 是目标配置的名称
当我执行 1 和 2 时出现错误
An error occurred when trying to create a controller of type 'ErrorCheckController'. Make sure that the controller has a parameterless public constructor.
第三个选项获取记录器,但未使用 NLog.config 文件配置
编辑
这是我的配置文件
<?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
我已将获取方法更改为
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();
}
这给了我一个错误
No matching bindings are available, and the type is not self-bindable.
这听起来好像没有任何东西绑定到 ILogger。
编辑 3
我回顾我的配置文件并注意到我已经告诉 NLog 静默失败。我关闭了它,现在我得到了正确的错误。我的
似乎有问题
我收到错误
Exception: Error when setting property 'Layout' on NLog.Targets.DatabaseParameterInfo
Inner Exception: LayoutRenderer cannot be found: 'appsetting'
我不太清楚为什么找不到我使用的语法与 appsetting 文档中的语法相同
Make sure that the controller has a parameterless public constructor.
您收到此错误的原因是:
- 您没有在 Ninject
中明确配置您的控制器
- 您的配置有误
因为控制器没有显式注册,Ninject 会尝试为您创建它,但由于配置存在问题,它会 return null
(由 IDependencyResolver
合同规定。
一旦您显式注册了所有控制器(您应该始终在容器中显式注册所有根类型),Ninject 将抛出一个表达性异常,解释配置错误是什么。显式注册所有根类型还允许您 test your DI configuration.
问题最终是我试图注入
NLog.ILogger
而不是
Ninject.Extensions.Logging.ILogger
现在正在运行。
您好,我正在尝试将 NLog 与 Web Api 2 应用程序一起使用,该应用程序使用 Ninject 进行依赖注入。
到目前为止,我一直在努力寻找有关如何执行此操作的任何具体信息,我已经为 NLog 和 NLog.Configuration 安装了 NuGet 包。到目前为止,我所读到的内容表明这些包应该可以正常工作并为我处理绑定。
我设置了 Nlog.config 文件,然后我安装了 Ninject.Extensions.Logging & Ninject.Extensions.NLog4 包。
我正尝试按如下方式使用 NLog
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();
}
}
在我的 NinjectWebCommon 我试过了
- 无绑定
- 绑定
kernel.Bind<ILogger>().To<Logger>();
- 与
kernel.Bind<ILogger>().ToMethod(lm => LogManager.GetLogger("MyLogger"));
绑定,其中 MyLogger 是目标配置的名称
当我执行 1 和 2 时出现错误
An error occurred when trying to create a controller of type 'ErrorCheckController'. Make sure that the controller has a parameterless public constructor.
第三个选项获取记录器,但未使用 NLog.config 文件配置
编辑 这是我的配置文件
<?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 我已将获取方法更改为
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();
}
这给了我一个错误
No matching bindings are available, and the type is not self-bindable.
这听起来好像没有任何东西绑定到 ILogger。
编辑 3
我回顾我的配置文件并注意到我已经告诉 NLog 静默失败。我关闭了它,现在我得到了正确的错误。我的
似乎有问题我收到错误
Exception: Error when setting property 'Layout' on NLog.Targets.DatabaseParameterInfo
Inner Exception: LayoutRenderer cannot be found: 'appsetting'
我不太清楚为什么找不到我使用的语法与 appsetting 文档中的语法相同
Make sure that the controller has a parameterless public constructor.
您收到此错误的原因是:
- 您没有在 Ninject 中明确配置您的控制器
- 您的配置有误
因为控制器没有显式注册,Ninject 会尝试为您创建它,但由于配置存在问题,它会 return null
(由 IDependencyResolver
合同规定。
一旦您显式注册了所有控制器(您应该始终在容器中显式注册所有根类型),Ninject 将抛出一个表达性异常,解释配置错误是什么。显式注册所有根类型还允许您 test your DI configuration.
问题最终是我试图注入
NLog.ILogger
而不是
Ninject.Extensions.Logging.ILogger
现在正在运行。