我是新来的工作在log4net
过滤器的logenteries我已经尝试过剩余的过滤器,如“水平范围,stringtomatch
,LoggerMatchFilter
”都工作正常,但属性过滤器无法正常工作。我尝试过不同的解决方案,但它不起作用。
这是我的代码:
码:
public class CustomFilter : FilterSkeleton
{
private bool acceptOnMatch;
private readonly IList<IFilter> filters = new List<IFilter>();
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
if (loggingEvent == null)
throw new ArgumentNullException("loggingEvent");
foreach (IFilter filter in filters)
{
if (filter.Decide(loggingEvent) != FilterDecision.Accept)
return FilterDecision.Neutral; // one of the filter has failed
}
// All conditions are true
if (acceptOnMatch)
return FilterDecision.Accept;
else
return FilterDecision.Deny;
}
public IFilter Filter
{
set { filters.Add(value); }
}
public bool AcceptOnMatch
{
get { return acceptOnMatch; }
set { acceptOnMatch = value; }
}
}
我在log4net filter - how to write AND filter to ignore log messages中看到过这个解决方案但对我来说过滤器没有添加到界面。我没有得到过滤器是否直接添加?在loggingevent我传递消息属性中的数据,但我不知道如何添加到属性可以任何人请指导我,我不知道如何调用此功能。
Webconfig:
<filter type="Namespace.CustomFilter, Assembly">
<filter type="log4net.Filter.PropertyFilter">
<key value="firstname" />
<stringToMatch value="1234" />
</filter>
<filter type="log4net.Filter.PropertyFilter">
<key value="address" />
<stringToMatch value="abcdf" />
</filter>
<acceptOnMatch value="false" />
</filter>
我错过了一些请帮助我的地方。我过去几个小时都在苦苦挣扎。
更新:
public string logFilter()
{
log4net.Config.XmlConfigurator.Configure();
ILog Log = LogManager.GetLogger(
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType
);
var ReferenceID = Guid.NewGuid().ToString();
var firstname = "1234";
var address ="abcdf";
var sno = "12";
Log.InfoFormat("firstname {0}-{1}", firstname, ReferenceID);
Log.InfoFormat("address {0}-{1}", address, ReferenceID);
Log.InfoFormat("sno {0}-{1}", sno, ReferenceID);
return ReferenceID;
}
这里决定()函数覆盖于filterskelton,但属性过滤器没有应用它能够从webconfig读取详细信息但它无法过滤日志消息是否有任何我错过的内容。
提前致谢!
如果其中一个过滤器返回FilterDecision.Neutral,则将记录日志消息。因此,您需要检查该消息是否同时通过所有过滤器
public override FilterDecision Decide(LoggingEvent loggingEvent)
{
if (loggingEvent == null)
throw new ArgumentNullException("loggingEvent");
if (filters.All(x => x.Decide(loggingEvent) != FilterDecision.Accept))
{
return FilterDecision.Neutral;
}
// All conditions are true
if (acceptOnMatch)
return FilterDecision.Accept;
else
return FilterDecision.Deny;
}
更新:我的log4net配置看起来像这样:
<filter type="MyApp.CustomFilter, MyApp">
<filter type="log4net.Filter.PropertyFilter">
<key value="firstname" />
<stringToMatch value="1234" />
</filter>
<filter type="log4net.Filter.PropertyFilter">
<key value="address" />
<stringToMatch value="abcdf" />
</filter>
<acceptOnMatch value="false"/>
</filter>
</appender>
示例如何检查日志记录
Task.Run(() =>
{
log4net.ThreadContext.Properties["firstname"] = "123";
Log.Info("123");
});
Task.Run(() =>
{
log4net.ThreadContext.Properties["firstname"] = "1234";
Log.Info("1234");
});
Task.Run(() =>
{
log4net.ThreadContext.Properties["address"] = "abcdf";
Log.Info("abcdf");
});