2012-06-21 50 views
3

我正在使用Ninject 3.0.1.10进行依赖项注入并且想要使用Ninject.Extensions.Logging 3.0.1.0 for log4net 1.2.11日志记录。但是,在使用扩展而不是直接使用log4net时,我在日志文件中获得了不同的输出。我想输出包含类/方法,做记录的名字一样,在我的app.config如下:Ninject.Extensions.Logging.Log4Net为类/方法名称生成不正确的输出

<log4net> 
    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="MyConsoleAppender" /> 
    </root> 

    <appender name="MyConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%date %-5level %C{1}.%M():%L - %m%n" /> 
     </layout> 
    </appender> 
</log4net> 

我做了一个样本项目来演示我看到如下问题:

public class LoggingWithLog4Net 
{ 
    private readonly ILog log; 

    public LoggingWithLog4Net(ILog log) 
    { 
     this.log = log; 
    } 

    public void LogMessage(string message) 
    { 
     log.Debug(message); 
    } 
} 

public class LoggingWithNinject 
{ 
    private readonly ILogger log; 

    public LoggingWithNinject(ILogger log) 
    { 
     this.log = log; 
    } 

    public void LogMessage(string message) 
    { 
     log.Debug(message); 
    } 
} 

public class Program 
{ 
    static void Main(string[] args) 
    { 
     log4net.Config.XmlConfigurator.Configure(); 

     NinjectSettings settings = new NinjectSettings() 
     { 
      LoadExtensions = false 
     }; 

     using (IKernel kernel = new StandardKernel(settings, new Log4NetModule())) 
     { 
      kernel.Bind<ILog>() 
       .ToConstant(LogManager.GetLogger("*")); 

      LoggingWithLog4Net l4n = kernel.Get<LoggingWithLog4Net>(); 
      LoggingWithNinject ninject = kernel.Get<LoggingWithNinject>(); 

      l4n.LogMessage("log4net message"); 
      ninject.LogMessage("ninject message"); 
     } 
    } 
} 

这将产生以下输出(在Ninject版本注意不正确的类/方法名):

2012-06-21 08:25:19,000 DEBUG LoggingWithLog4Net.LogMessage():21 - log4net message 
2012-06-21 08:25:19,015 DEBUG Log4NetLogger.Debug():98 - ninject message 

我希望在第二行有LoggingWithNinject.LogMessage():21作为源类/方法,而是使用Ninject Log4NetLogger作为源。我如何才能正确识别来源?

回答

0

看来,我想要的是不可能的。该配置的%C{1}.%M():%L部分会导致log4net打印调用类的位置信息。在log4net版本中,您可以拨打Log4NetLogger并将您的呼叫传递到log4net。这意味着来源将永远是Log4NetLogger

作为一种妥协,我已经使用了以下内容:

<conversionPattern value="%date [%thread] %-5level %c - %m%n" /> 

这失去呼叫的方法名称和行号,但你得到了正确的类名使用Ninject扩展时,因为记录仪总是由Type请求,其默认为类的完整名称空间/名称组合。

另一种方法是直接注入log4net.ILog并停止使用Ninject扩展。

+0

我现在正遇到这个问题。这似乎是Ninject.Extensions.Logging功能中的一个巨大漏洞。它似乎归结为,你可以有依赖注入使用框架和ILogger接口或正确的stacktrace /类名称等,并使用ILog接口。是对的还是我错过了什么? –