声明使用Ninject新log4net的记录器 [英] Declare a new log4net logger using Ninject

查看:187
本文介绍了声明使用Ninject新log4net的记录器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发用C#一个Web API应用,.NET Framework 4.0中,Ninject 3.2.2.0和log4net的2.0.3。

现在,我只使用一个记录器。这是我在 NinjectConfigurator配置,如果类。

 私人无效ConfigureLog4net(容器的iKernel)
{
    log4net.Config.XmlConfigurator.Configure();
    变种loggerForWebSite = LogManager.GetLogger(AutomationMiddlewareWebsite);
    container.Bind<&ILog的GT;()ToConstant(loggerForWebSite)。
}

不过,我需要使用另一个记录器。 是,Ninject,我该怎么办呢? 我不知道如何申报 NinjectConfigurator 类新记录。

如果我宣布另外一个记录器,我无法使用的ILog 将其绑定到我的新记录。也许,我可以把它绑定使用带参数...

这是的Web.config

我的 log4net的配置

 < log4net的XSI:no​​NamespaceSchemaLocation =htt​​p://csharptest.net/downloads/schema/log4net.xsd的xmlns:XSI =htt​​p://www.w3.org / 2001 / XML模式实例>
    <追加程序名称=RollingLogFileAppenderTYPE =log4net.Appender.RollingFileAppender>
      <文件值=D:\\\\ MyProject.Web.Api.log/>
      < appendToFile值=真/>
      < rollingStyle值=日期/>
      < datePattern值=。yyyyMMdd.lo \\ G/>
      < maximumFileSize值=5MB/>
      &所述; maxSizeRollBackups值= - 1/>
      &所述; countDirection值=1/>
      <布局类型=log4net.Layout.PatternLayout>
        < conversionPattern值=%DATE%-5level [%线程]%记录仪 - 消息%换行符%的异常%/>
      < /布局>
    < /附加器>
    <追加程序名称=是ConsoleAppenderTYPE =log4net.Appender.ConsoleAppender>
      <布局类型=log4net.Layout.PatternLayout>
          < conversionPattern值=%DATE%-5level [%线程]%记录仪 - 消息%换行符%的异常%/>
      < /布局>
    < /附加器>
    <记录器名称=MyProjectWebsite>
      <电平值=DEBUG/>
    < /记录器>
    <根和GT;
      <电平值=DEBUG/>
      <附加目的地-REF REF =RollingLogFileAppender/>
    < /根>
  < / log4net的>


解决方案

您可以绑定多个记录仪 .ToConstant(...)和使用的上下文绑定设施的如 .WhenInjectedInto< SomeClass的>()

 绑定< ILOG方式>()ToConstant(logger1)
    .WhenInjectedInto< 1级>();

不过,如果你需要记录器注入了很多,将present大量的工作和可维护性很差类。

在这种情况下,你可以选择使用 ToMethod(..)绑定或使用的提供商并创造记录器根据上下文,像这样:

 绑定< ILog的方式>()ToMethod(上下文=>
                 LogManager.GetLogger(context.Request.ParentContext.Plan.Type));

context.Request.ParentContext.Plan.Type 是类型的ILog 注入)

当然你也可以用一些精心制作的计划,以确定使用基于类的名字而记录,类组件,类命名空间,...你的名字。

如果你想只有一个或两个特定记录器可以使用上下文结合(当(...))的办法,如果更多,你可以使用 ToMethod(...) IProvider 办法。

I'm developing a Web Api application with C#, .NET Framework 4.0, Ninject 3.2.2.0 and log4net 2.0.3.

Now, I only using one logger. This is how I configure if on NinjectConfigurator class.

private void ConfigureLog4net(IKernel container)
{
    log4net.Config.XmlConfigurator.Configure();
    var loggerForWebSite = LogManager.GetLogger("AutomationMiddlewareWebsite");
    container.Bind<ILog>().ToConstant(loggerForWebSite);
}

But, I need to use another logger. Using, Ninject, how can I do it? I'm don't know how to declare this new logger in NinjectConfigurator class.

If I declare another logger, I can't use ILog to bind it to my new logger. Maybe, I can use bind it with parameters...

This is my log4net configuration in Web.config.

<log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="d:\\MyProject.Web.Api.log" />
      <appendToFile value="true" />
      <rollingStyle value="Date" />
      <datePattern value=".yyyyMMdd.lo\g" />
      <maximumFileSize value="5MB" />
      <maxSizeRollBackups value="-1" />
      <countDirection value="1" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" />
      </layout>
    </appender>
    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
      <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date %-5level [%thread] %logger - %message%newline%exception" />
      </layout>
    </appender>
    <logger name="MyProjectWebsite">
      <level value="DEBUG" />
    </logger>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="RollingLogFileAppender" />
    </root>
  </log4net>

解决方案

You could bind multiple loggers .ToConstant(...) and use Contextual Binding facilities like .WhenInjectedInto<SomeClass>().

Bind<Ilog>().ToConstant(logger1)
    .WhenInjectedInto<Class1>();

But if you need to inject the logger into a lot of classes that would present a lot of work and very poor maintainability.

In that case you can opt to use the ToMethod(..) binding or use a provider and create the logger depending on the context, like so:

Bind<ILog>().ToMethod(context =>
                 LogManager.GetLogger(context.Request.ParentContext.Plan.Type));

(context.Request.ParentContext.Plan.Type is the Type ILog is injected into)

of course you can use some elaborate scheme to determine which logger to use based on the class name, the class assembly, the class namespace,.. you name it.

If you want only one or two specific loggers you can use the contextual binding (When(...)) approach and if more, you can use the ToMethod(...) or IProvider approach.

这篇关于声明使用Ninject新log4net的记录器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆