2010-04-14 57 views
7

我使用log4net記錄我的web應用程序的進度,使用Log4PostSharp來AOP注入所有方法。這具有記錄(幾乎)所有內容的理想效果,並且很好。過濾方法名稱上的log4net - 不能完全得到它

我現在有要求將Page_Load方法記錄到文件/控制檯。我顯然可以用log4postsharp類來做這件事,但是我會失去所有其他的日誌記錄。

我一直在尋找log4net中的過濾器,從StringMatch過濾器開始,但只查看正在記錄的消息,並且我在方法名稱後面。這讓我進入了PropertyFilter,但仍然沒有快樂。我log4net.config片段是這樣的:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <filter type="log4net.Filter.PropertyFilter"> 
    <key value="LocationInfo.MethodName"/> 
    <stringToMatch value="Page_Load"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file value="d:\\xxxx\\yyyyy\\zzzzLog"/> 

正如你所看到的,我想Key插入通過LocationInfo記錄事件的方法名,但我還是讓一切記錄下來。編輯:正如在評論中提到的,我現在包括我在RTFM後添加的DenyAllFilter ;-)

任何人都可以協助嗎?

謝謝

邁克K.

+0

NB:我現在已經添加了<過濾器類型=「log4net.Filter.DenyAllFilter」 />後過濾停止一切被記錄,一旦我得到methodname過濾器的工作原理 – 2010-04-14 11:23:27

+0

您是否添加了DenyAllFilter?你會得到一切或沒有記錄呢?你應該更新你的問題來反映你的進步。 – 2010-04-14 13:01:09

回答

4

至於我可以告訴log4net的不知道財產LocationInfo.MethodName。我沒有使用Log4PostSharp,所以我無法確定Log4PostSharp是否會創建此屬性。

我會寫我自己的過濾器這樣的方法名稱來過濾(正則表達式部分略):

public class MethodNameFilter : StringMatchFilter 
{  
    override public FilterDecision Decide(LoggingEvent loggingEvent) 
    { 
     if (loggingEvent == null) 
     { 
       throw new ArgumentNullException("loggingEvent"); 
     } 

     var locationInfo = loggingEvent.LocationInformation; 

     // Check if we have been setup to filter 
     if (locationInfo == null || (m_stringToMatch == null && m_regexToMatch == null)) 
     { 
      // We cannot filter so allow the filter chain 
      // to continue processing 
       return FilterDecision.Neutral; 
     } 

     if (m_stringToMatch != null) 
     { 
      // Check substring match 
      if (locationInfo.MethodName.IndexOf(m_stringToMatch) == -1) 
      { 
        // No match, continue processing 
        return FilterDecision.Neutral; 
      } 

      // we've got a match 
      if (m_acceptOnMatch) 
      { 
        return FilterDecision.Accept; 
      } 
      return FilterDecision.Deny; 
     } 
     return FilterDecision.Neutral; 
    } 
} 

注:訪問LocationInfo是昂貴並能對性能有顯着的影響。您可以考慮修改Log4PostSharp以在編織過程中提取方法名稱並將其存儲在某個屬性中。在這種情況下,您可以按照您的預期使用屬性過濾器,並且不會對性能產生任何影響。不知道這是否真的有效,但我希望這是可能的。

的配置會是這個樣子:

<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> 
    <filter type="YourNameSpace.MethodNameFilter"> 
     <stringToMatch value="Page_Load"/> 
    </filter> 
    <filter type="log4net.Filter.DenyAllFilter" /> 
    <file value="d:\\xxxx\\yyyyy\\zzzzLog"/> 
+0

m_stringToMatch在哪裏/如何傳入? – 2010-05-07 10:06:44

+0

您以與屬性過濾器相同的方式配置此新過濾器。你只需要部分。另請參閱我的修訂答案。 – 2010-05-07 10:10:13

+0

謝謝 - 有一個賞金;-) – 2010-05-07 10:20:30