2013-05-03 140 views
2

我正在使用Log4Net作爲我們的應用程序的日誌記錄機制。我們的配置包含在一個配置文件中,在我們的代碼中,我們以編程方式調用我們想要調用的幾個記錄器中的哪一個(主要使用FileAppenders)。最近我意識到我們的一個日誌文件沒有被填充,並且在我們的配置文件中的名稱與我們在代碼中編程調用的名稱之間,我將它追蹤爲字符串不匹配。因爲LogManager找不到指定的記錄器,所以返回根目錄,這對於我們的配置沒有設置爲在任何地方進行有意義的記錄。在Log4Net中找不到記錄器時設置默認日誌

我的問題是,是否有一種方法來設置log4net允許使用特定的logger s,但如果找不到指定的logger,則會回退到一般的logger

例如使用這樣

<configuration> 
<configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
</configSections> 

<log4net> 
    <root> 
     <level value="ALL" /> 
     <appender-ref ref="ConsoleAppender" /> 
    </root> 

    <logger name="TestFileLogger"> 
     <level value="ALL" /> 
     <appender-ref ref="TestFileAppender" /> 
    </logger> 

    <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 
     <layout type="log4net.Layout.PatternLayout"> 
      <param name="ConversionPattern" value="%d [%t] %-5p [%x] - %m%n" /> 
     </layout> 
    </appender> 

    <appender name="TestFileAppender" type="log4net.Appender.RollingFileAppender"> 
     <param name="File" value="TestLog" /> 
     <param name="DatePattern" value=".yyyyMMdd&quot;.log&quot;" /> 
     <param name="AppendToFile" value="true" /> 
    </appender> 

</log4net> 
</configuration> 

配置文件並調用C#中的伐木工人這樣

var fileLogger = LogManager.GetLogger("TestFileLogger"); 
fileLogger.Info("This logs appropriately."); 

var bogusLogger = LogManager.GetLogger("Bogus"); 
bogusLogger.Info("This should go to a general log. Bogus is not a recognized appender"); 

有從bogusLogger消息記錄到某種一般的好方法日誌文件?我最初的想法是創建一個通用文件appender,它是根節點的一部分,但是這是非常嘈雜的,因爲所有日誌消息都將被路由到這個文件。有沒有辦法只路由不在另一個日誌文件中捕獲的消息?

回答

4

您可以使用LogManager.Exists("Bogus")來確定是否應該使用虛假記錄器或您的默認實現。

您可以在LogManager上創建一個可爲您處理的擴展方法。

+1

感謝您的建議! 'LogManager.Exists'是確定記錄器是否真正存在的好方法,因爲如果找不到指定的記錄器,'LogManager.GetLogger'將始終返回'root'。小記:LogManager是靜態的,因此不能有擴展方法,但是一個包裝類很好用! – jstromwick 2013-05-29 18:45:45