C# Log4Net以编程方式检查Appender筛选器的IsEnabled
如何以编程方式检查某个appender筛选器的C# Log4Net以编程方式检查Appender筛选器的IsEnabled,c#,log4net,log4net-configuration,C#,Log4net,Log4net Configuration,如何以编程方式检查某个appender筛选器的IsEnablefor是否为true 这是我的配置: <log4net> <root> <level value="ALL" /> <appender-ref ref="appender" /> </root> <appender name="appender" type="log4net.Appender.FileAppender"> <filter
IsEnablefor
是否为true
这是我的配置:
<log4net>
<root>
<level value="ALL" />
<appender-ref ref="appender" />
</root>
<appender name="appender" type="log4net.Appender.FileAppender">
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<log4net>
好的,如果我将
级别设置为ERROR
,并执行IsEnablefor
(调试),它将返回true
,但如果我将
级别设置为ALL
,并将过滤器添加到附录中,则不考虑过滤器
我如何让它包含appender过滤器,或者是否有其他方法来查询它?我可能错了,但我不知道如何轻松做到这一点。你可以这样做:
var hierarchy = LogManager.GetRepository() as Hierarchy;
if(hierarchy != null)
{
var appenders = hierarchy.GetAppenders();
foreach( IAppender appender in appenders)
{
var appenderSkeleton = a as AppenderSkeleton
if (appenderSkeleton != null)
{
IFilter filterHead = appenderSkeleton.FilterHead;
// now analyse the filter chain
}
}
}
我没有测试这段代码,但它应该或多或少可以工作。通过这种方式得到的是从AppenderSkeleton
派生的所有appender的任何配置过滤器链的头部。筛选器链的头实现了IFilter
(与所有筛选器一样),它包含一个方法和一个属性:
FilterDecision Decide(LoggingEvent loggingEvent);
IFilter Next { get; set; }
现在,您可以使用感兴趣的日志级别创建一个LoggingEvent
实例,并使用Next
属性遍历过滤器链,通过调用FilterDecision
测试每个过滤器
这会告诉您appender是否会接受或拒绝日志事件,但您需要注意,appender也可能会根据其他条件(例如消息内容)进行过滤,因此它不会完全是“IsEnableFor”实现。我知道这是一篇旧文章,但Stefan的回答有助于构建以下内容。我的用例是用于给定操作性能的自定义日志记录级别。显然,我们需要切换此级别的能力 在我的特殊情况下,我们只使用LevelMatchFilter,这样我们就不会遇到其他过滤器类型的问题
/// <summary>
/// evaulates if a custom log level is enabled.
/// </summary>
/// <param name="log"></param>
/// <param name="level"></param>
/// <returns></returns>
public static bool IsLevelEnabled(this log4net.ILog log, log4net.Core.Level level)
{
var hierarchy = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;
if (hierarchy != null)
{
var appenders = hierarchy.GetAppenders();
foreach (log4net.Appender.IAppender appender in appenders)
{
var appenderSkeleton = appender as log4net.Appender.AppenderSkeleton;
if (appenderSkeleton != null)
{
log4net.Filter.IFilter filterHead = appenderSkeleton.FilterHead;
//traverse the filter chain
var currentFilter = filterHead;
while (currentFilter.Next != null)
{
if (currentFilter is log4net.Filter.LevelMatchFilter)
{
//if the filter level matches the target
if (((log4net.Filter.LevelMatchFilter)currentFilter).LevelToMatch == level)
{
return true;
}
}
//move to the next filter
currentFilter = currentFilter.Next;
}
}
}
}
return false;
}
//
///如果启用了自定义日志级别,则进行评估。
///
///
///
///
公共静态bool IsLevelEnabled(此log4net.ILog日志,log4net.Core.Level)
{
var hierarchy=log4net.LogManager.GetRepository()作为log4net.Repository.hierarchy.hierarchy;
if(层次结构!=null)
{
var appenders=hierarchy.GetAppenders();
foreach(Appender中的log4net.Appender.iaappender Appender)
{
var appenderSkeleton=作为log4net.appender.appenderSkeleton的appender;
if(appenderSkeleton!=null)
{
log4net.Filter.IFilter filterHead=appenderSkeleton.filterHead;
//遍历过滤器链
var currentFilter=过滤头;
while(currentFilter.Next!=null)
{
if(currentFilter为log4net.Filter.LevelMatchFilter)
{
//如果筛选器级别与目标匹配
if(((log4net.Filter.LevelMatchFilter)currentFilter).LevelToMatch==level)
{
返回true;
}
}
//移动到下一个过滤器
currentFilter=currentFilter.Next;
}
}
}
}
返回false;
}
你好,谢谢。是的,我看到了,决定不走那条路。没想到这是可能的,也没想到这么简单。。。