首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在方法名上过滤log4net -无法完全获取它

在方法名上过滤log4net -无法完全获取它
EN

Stack Overflow用户
提问于 2010-04-14 19:10:51
回答 1查看 1.5K关注 0票数 7

我正在使用log4net记录我的web应用程序的进度,使用Log4PostSharp对所有方法进行面向方面的注入。这具有(几乎)记录所有内容的预期效果,并且很好。

我现在要求只将Page_Load方法记录到文件/控制台中。很明显,我可以使用log4postsharp类来做这件事,但是那样我就会丢失所有其他的日志。

我一直在研究log4net中的筛选器,从StringMatch筛选器开始,但它只查看正在记录的消息,我关注的是方法名。这让我上了PropertyFilter,但还是没有和joy在一起。我的log4net.config代码片段如下:

代码语言:javascript
复制
<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 ;-)

有人能帮上忙吗?

谢谢,

迈克·K。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-02 20:12:09

据我所知,log4net不知道property LocationInfo.MethodName。我没有使用Log4PostSharp,所以我不能确定Log4PostSharp是否会创建这个属性。

我会像这样编写自己的过滤器来按方法名过滤(省略了regex部分):

代码语言:javascript
复制
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以在编织过程中提取方法名称,并将其存储在某个属性中。在这种情况下,您可以按预期使用属性筛选器,并且不会对性能产生任何影响。不确定这是否真的有效,但我希望这是可能的。

配置如下所示:

代码语言:javascript
复制
<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"/>
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2636797

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档