gpt4 book ai didi

asp.net - 根据方法名称过滤 log4net - 不太明白

转载 作者:行者123 更新时间:2023-12-03 22:05:07 25 4
gpt4 key购买 nike

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

我现在需要将 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 ;-)

有人可以帮忙吗?

谢谢,

迈克·K。

最佳答案

据我所知,log4net 不知道 房产 位置信息。方法名称。我没有使用 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"/>

关于asp.net - 根据方法名称过滤 log4net - 不太明白,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2636797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com