我如何编程检查IsEnabledFor是真的一定附加器过滤。
好吧,这是我的配置排序
<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>
好了,所以如果我设置根>等级要说错误,我做了IsEnabledFor(调试)返回true,但如果我设置根>一级所有,并添加过滤器,它没有考虑到过滤器的附加器。 让我怎么得到它包括附加器过滤器或有另一种方式来查询这个。
谢谢
我可能是错的,但我不明白这是如何可以轻松完成。 你可以做的是这样的:
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
。 过滤器链的头部实现IFilter
(因为这样做所有的过滤器),它包含一个方法和一个属性:
FilterDecision Decide(LoggingEvent loggingEvent);
IFilter Next { get; set; }
现在,你可以创建一个实例LoggingEvent
用的日志级别您有兴趣,并通过使用经过过滤器链Next
财产,并通过调用测试每个过滤器FilterDecision
。
这就告诉你,如果附加器会接受或拒绝的记录事件,但你必须要知道,一个appender也可以筛选基于其他标准(例如,消息内容),因此这将不完全是一个“IsEnabledFor”执行。
我知道这是旧的文章,但斯特凡的答案可以帮助构建以下。 我用例是对给定操作的性能自定义日志记录级别。 很显然,我们需要切换此水平的能力。
在我的具体情况,我们只使用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;
}