声明使用Ninject新log4net的记录器 [英] Declare a new log4net logger using Ninject
问题描述
我正在开发用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:noNamespaceSchemaLocation =http://csharptest.net/downloads/schema/log4net.xsd的xmlns:XSI =http://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屋!