在方法名称上过滤log4net - 无法完全获得它

时间:2010-04-14 11:10:51

标签: asp.net log4net postsharp log4postsharp

我正在使用log4net来记录我的Web应用程序的进度,使用Log4PostSharp来AOP-injectify所有方法。这具有记录(几乎)一切所需的效果,并且很好。

我现在需要将JUST 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"/>

正如您所看到的,我正在尝试通过LocationInfo键入日志记录事件的MethodName,但我仍然记录了所有内容。编辑:正如评论中所提到的,我现在已经包含了我在RTFM之后添加的DenyAllFilter; - )

有人可以帮忙吗?

谢谢,

Mike K。

1 个答案:

答案 0 :(得分: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"/>