2012-06-21 95 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接口。是對的還是我錯過了什麼? –