NLog文章系列——如何编写自定义的过滤器(Filter)
2006-12-25 23:19
756 查看
作者:JarosławKowalski<jaak@jkowalski.net>
翻译:CrazyCoder(由衷感谢他的热心!!)原文:http://www.nlog-project.org/howto_write_filter.html更多关于NLog的中文文章,请参考《NLog文章系列》。为什么要编写自定义过滤器?
过滤器的作用就是减少向日志目标输出不需要的日志信息。NLog提供一些预定义的过滤器,这些过滤器支持大多数常用的字符串运算符。如果这些预定义的过滤器不符合你的需求,那就自己动手吧。
怎样编写?
写一个过滤器并不复杂。写一个继承了
FilterResult.Ignore–这个消息不应该被记录。
FilterResult.Log–这个消息应该被记录。也不需要其它过滤器的进一步检查。
通常即使一个消息符合过滤条件,也应该让用户来决定这个消息是否应当被过滤。这种情况下如果符合过滤条件滤器都应当返回
例子
这个例子里介于两个特定时间之间记录的日志信息会被过滤。
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
如何使用自定义过滤器
只要把自定义过滤器所在的动态链接库引用到配置文件的<extensions/>区域即可,具体做法请参考这里。
配置文件的例子
这个配置文件设置过滤在10:00和12:59之间记录的日志。很简单吧。
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
怎样将配置参数传递给过滤器
看一下上面的例子,“FromHour”和“ToHour”这个两个属性就是两个配置参数。只需在类中声明公有属性来保存配置参数就可以了。过滤器配置中的每一个参数都会被传递给正确的公有属性。NLog支持integer,string,datetime和boolean类型的参数并会对类型进行自动转换。参数都是大小写敏感的。
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
这里在配置过滤器的时候FromHour的值被设为10,ToHour的值被设为12。可以使用更多的参数来传递更多的属性:
需要一个专门的动态链接库吗?
完全不必。可以调用FilterFactory.AddFilter()来通过程序注册过滤器。不过必须保证注册完成之前不能记录任何日志信息。在<extensions/>区域参照EXE可执行文件是允许的。
Lastupdated:2006-07-1011:32:55
翻译:
过滤器的作用就是减少向
怎样编写?
写一个过滤器并不复杂。写一个继承了
NLog.Filter的类并重写其中的
Check()方法就可以了。
Check()方法的返回值包括:FilterResult.Neutral–该过滤器不想决定这个消息是否应被记录。其它的过滤器(如果有的话)可以进一步检查。
FilterResult.Ignore–这个消息不应该被记录。
FilterResult.Log–这个消息应该被记录。也不需要其它过滤器的进一步检查。
通常即使一个消息符合过滤条件,也应该让用户来决定这个消息是否应当被过滤。这种情况下如果符合过滤条件滤器都应当返回
Result。如果过滤器要支持用户自定义配置那么应该返回
Result或者
FilterResult.Neutral。
例子
这个例子里介于两个特定时间之间记录的日志信息会被过滤。
csc.exe/t:library/out:MyAssembly.dll/r:NLog.dllMyFirstFilter.cs
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
usingSystem;
usingSystem.Text;
usingNLog;
namespaceMyNamespace
{
[Filter("hourRange")]
publicsealedclassHourRangeFilter:Filter
{
privateint_fromHour=0;
privateint_toHour=-1;
publicintFromHour
{
get{return_fromHour;}
set{_fromHour=value;}
}
publicintToHour
{
get{return_toHour;}
set{_toHour=value;}
}
protectedoverrideFilterResultCheck(LogEventInfoev)
{
if(ev.TimeStamp.Hour>=FromHour&&ev.TimeStamp.Hour<=ToHour)
returnResult;
else
returnFilterResult.Neutral;
}
}
}
如何使用自定义过滤器
只要把自定义过滤器所在的动态链接库引用到配置文件的<extensions/>区域即可,具体做法请参考
配置文件的例子
这个配置文件设置过滤在10:00和12:59之间记录的日志。很简单吧。
<nlog>
<extensions>
<addassembly="MyAssembly"/>
</extensions>
<targets>
<targetname="console"type="Console"/>
</targets>
<rules>
<loggername="*"minLevel="Info"appendTo="console">
<filters>
<hourRangefromHour="10"toHour="12"action="Ignore"/>
</filters>
</logger>
</rules>
</nlog>
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
怎样将配置参数传递给过滤器
看一下上面的例子,“FromHour”和“ToHour”这个两个属性就是两个配置参数。只需在类中声明公有属性来保存配置参数就可以了。过滤器配置中的每一个参数都会被传递给正确的公有属性。NLog支持integer,string,datetime和boolean类型的参数并会对类型进行自动转换。参数都是大小写敏感的。
<filters>...<hourRangefromHour="10"toHour="12"action="Ignore"/>...</filters>
.csharpcode,.csharpcodepre
{
font-size:small;
color:black;
font-family:consolas,"CourierNew",courier,monospace;
background-color:#ffffff;
/*white-space:pre;*/
}
.csharpcodepre{margin:0em;}
.csharpcode.rem{color:#008000;}
.csharpcode.kwrd{color:#0000ff;}
.csharpcode.str{color:#006080;}
.csharpcode.op{color:#0000c0;}
.csharpcode.preproc{color:#cc6633;}
.csharpcode.asp{background-color:#ffff00;}
.csharpcode.html{color:#800000;}
.csharpcode.attr{color:#ff0000;}
.csharpcode.alt
{
background-color:#f4f4f4;
width:100%;
margin:0em;
}
.csharpcode.lnum{color:#606060;}
这里在配置过滤器的时候FromHour的值被设为10,ToHour的值被设为12。可以使用更多的参数来传递更多的属性:
<filters>...<hourRangep1=""p2=""p3=""p4=""pN=""action="Ignore"/>...</filters>
需要一个专门的动态链接库吗?
完全不必。可以调用FilterFactory.AddFilter()来通过程序注册过滤器。不过必须保证注册完成之前不能记录任何日志信息。在<extensions/>区域参照EXE可执行文件是允许的。
staticvoidMain(string[]args)
{
FilterFactory.AddFilter("MyFirst",typeof(MyNamespace.MyFirstFilter));
//startlogginghere
}
Lastupdated:2006-07-1011:32:55
相关文章推荐
- NLog文章系列——如何写自定义布局生成器(Layout Renderer)
- NLog文章系列——如何优化日志性能
- NLog文章系列——如何配置NLog
- django “如何”系列4:如何编写自定义模板标签和过滤器
- django “如何”系列4:如何编写自定义模板标签和过滤器
- NLog文章系列——系列文章目录以及简要介绍
- NLog文章系列——如何配置NLog
- NLog文章系列——如何配置NLog
- NLog文章系列——如何配置NLog
- django “如何”系列5:如何编写自定义存储系统
- NLog文章系列——入门教程(中)
- NLog文章系列——如何配置NLog
- NLog文章系列——入门教程(下)
- NLog文章系列——如何配置NLog(转)
- 系列文章:在Ubuntu上为Android系统编写Linux内核驱动程序
- 如何把ASP编写成DLL这篇文章主要是把ASP代码变成组件
- 需求工程系列(七)- 如何编写用例的前置条件
- 玩转大数据系列之Apache Pig如何通过自定义UDF查询数据库(五)
- NLog文章系列——入门教程(转)
- 学习《如何提升程序员的代码编写能力》文章笔记