使用NLog的Ninject记录器

时间:2012-12-06 16:47:31

标签: c# ninject nlog

我刚刚开始学习Ninject但是遇到了记录器的问题。我现在有一个控制器,它有一个服务和记录器注入构造函数,如下所示:

public ToolsController(IToolsService toolsService, ILogger logger)
{
    logger.Info("ToolsController Created");
    this.toolsService = toolsService;
    this.logger = logger;
}

问题出在构造函数中的logger.Info行(例如),它似乎使用了错误的记录器,因此它打印出的记录器名称不正确。

Tools.IGeocodeImporter: ToolsController Created 

以下是如何设置获取记录器名称:

kernel.Bind<ILogger>().To<Logger>().WithConstructorArgument("name", x => x.Request.ParentContext.Request.Service.FullName);

任何建议都将受到赞赏。

4 个答案:

答案 0 :(得分:15)

我使用以下内容:

.Bind<ILog>().ToMethod(p => LogManager.GetLogger(
                   p.Request.Target.Member.DeclaringType));

使记录器具有类的名称。我正在使用Log4net,但我认为这个想法也可以应用于任何日志:实际上绑定到一个方法可以打开任何解决方案以创建所需的实例。

答案 1 :(得分:9)

我使用名为Ninject.Extensions.Logging.NLog2的ninject扩展,可以在NuGetGitHub找到。它处理NLog的绑定,所以你不必做任何其他事情,只需将它添加到你的项目中,并删除你现在拥有的任何NLog绑定。

答案 2 :(得分:1)

正如Felice所说,你可以使用相同的方法,但对于Nlog,你需要做一点改动:

.Bind<ILogger>().ToMethod(p => NLog.LogManager.GetCurrentClassLogger(
                   p.Request.Target.Member.DeclaringType));

答案 3 :(得分:0)

目前没有一个答案能正常工作。要做到这一点,你必须写:

_kernel.Bind<ILogger>().ToMethod(p => LogManager.GetLogger(p.Request.Target.Member.DeclaringType.FullName));

但为了让它更安全,我想提议:

_kernel.Bind<ILogger>().ToMethod(p => LogManager.GetLogger(p.Request.Target?.Member.DeclaringType.FullName ?? typeof(App).GetType().FullName));

其中 App 是您的启动课程。