2009-11-05 23 views
8

我使用的是log4net,並且在一個類中需要記錄到RollingFile appender,但是在另一個類中,我希望記錄到事件日誌+滾動文件+控制檯appender。根據情況登錄log4net到不同的appender

最佳做法是什麼?我能看到一些示例代碼嗎?

順便讓事情變得更加困難,我正在使用Castle Windsor日誌記錄工具與Log4net來解決我的記錄器實例。

如果有幫助,我下面想這一點,但不知道這是不是最好的做法,或如何基於「名」還是利用我目前的記錄器實例從溫莎到激活特定的記錄:

log4net.config:

... 
    <logger name="EventLogOnly"> 
     <level value="ALL" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 
    <logger name="ConsoleEventLog"> 
     <level value="ALL" /> 
     <appender-ref ref="ColoredConsoleAppender" /> 
     <appender-ref ref="EventLogAppender" /> 
    </logger> 
... 

溫莎城堡容器器類:

container.AddFacility("logging.facility", 
    new LoggingFacility(LoggerImplementation.Log4net, "log4net.config")); 

類中記錄:

private ILogger Logger; 
public Test(ILogger logger) { 
    Logger.Info("Can I log under event log only?"); 
    Logger.Info("Now can I log under both?"); 
} 

謝謝你們。

+0

在這裏您可以找到創建命名記錄器實例的方法[tip](http://kenegozi.com/blog/2009/12/11/windsorrsquos-logging-facility-getting-a-named-instance) – 2012-04-17 11:27:47

回答

12

你可以通過對appender應用一個過濾器來做到這一點。只有當日志事件通過過濾器時,該appender纔會記錄該事件。

這個過濾器配置將只記錄在數據記錄儀來這些事件命名爲「MyLogger」:

<appender name="EventLogAppender" ... 
    <filter type="log4net.Filter.LoggerMatchFilter"> 
     <loggerToMatch value="MyLogger" /> 
    </filter>  
    <filter type="log4net.Filter.DenyAllFilter" /> 
</appender> 

...而這一次將匹配與某些包含的文本日誌消息:

<filter type="log4net.Filter.StringMatchFilter"> 
    <stringToMatch value="database" /> 
</filter> 
<filter type="log4net.Filter.DenyAllFilter" /> 

過濾器可以進行很多配置。有關更多詳細信息,請參見log4net SDKmanual的Filters部分。

+0

感謝邁克爾,但我仍然不確定如何按名稱訪問我的記錄器。使用Castle Windsor中的日誌工具,我沒有通過使用LogManager.GetLogger(「loggerName」)來實例化一個新實例,我的一個實例已經通過。 – GONeale 2009-11-05 02:23:45

+0

您是否閱讀過我的答案中的鏈接?除了記錄器名稱之外,您還可以過濾很多內容。 – 2009-11-05 02:27:02

+0

對不起,我知道你在談論過濾器,但爲了開始這個appender的工作,我認爲我仍然需要通過名稱訪問記錄器。我將如何獲得appender被拾起?在appender周圍使用正在工作較早,我是否應該試圖將這個過濾的appender包裝進來,而不是實際的命名記錄器? – GONeale 2009-11-05 02:30:58