NLog文章系列——如何編寫(xiě)自定義的過(guò)濾器(Filter)
作者:Jaros?aw Kowalski <jaak@jkowalski.net>
翻譯:CrazyCoder(由衷感謝他的熱心!!)
原文:http://www.nlog-project.org/howto_write_filter.html
更多關(guān)于NLog的中文文章,請(qǐng)參考《NLog文章系列》。
為什么要編寫(xiě)自定義過(guò)濾器?
過(guò)濾器的作用就是減少向日志目標(biāo)輸出不需要的日志信息。NLog提供一些預(yù)定義的過(guò)濾器,這些過(guò)濾器支持大多數(shù)常用的字符串運(yùn)算符。如果這些預(yù)定義的過(guò)濾器不符合你的需求,那就自己動(dòng)手吧。
怎樣編寫(xiě)?
寫(xiě)一個(gè)過(guò)濾器并不復(fù)雜。寫(xiě)一個(gè)繼承了NLog.Filter的類并重寫(xiě)其中的Check()方法就可以了。Check()方法的返回值包括:
- FilterResult.Neutral – 該過(guò)濾器不想決定這個(gè)消息是否應(yīng)被記錄。其它的過(guò)濾器(如果有的話)可以進(jìn)一步檢查。
- FilterResult.Ignore – 這個(gè)消息不應(yīng)該被記錄。
- FilterResult.Log – 這個(gè)消息應(yīng)該被記錄。也不需要其它過(guò)濾器的進(jìn)一步檢查。
通常即使一個(gè)消息符合過(guò)濾條件,也應(yīng)該讓用戶來(lái)決定這個(gè)消息是否應(yīng)當(dāng)被過(guò)濾。這種情況下如果符合過(guò)濾條件濾器都應(yīng)當(dāng)返回Result。如果過(guò)濾器要支持用戶自定義配置那么應(yīng)該返回Result或者FilterResult.Neutral。
例子
這個(gè)例子里介于兩個(gè)特定時(shí)間之間記錄的日志信息會(huì)被過(guò)濾。
csc.exe /t:library /out:MyAssembly.dll /r:NLog.dll MyFirstFilter.cs
using System; using System.Text; using NLog; namespace MyNamespace { [Filter("hourRange")] public sealed class HourRangeFilter: Filter
{ private int _fromHour = 0;
private int _toHour = -1;
public int FromHour
{ get { return _fromHour; } set { _fromHour = value; } }
public int ToHour
{ get { return _toHour; } set { _toHour = value; } }
protected override FilterResult Check(LogEventInfo ev)
{ if (ev.TimeStamp.Hour >= FromHour && ev.TimeStamp.Hour <= ToHour) return Result; else return FilterResult.Neutral; }
}
}
如何使用自定義過(guò)濾器
只要把自定義過(guò)濾器所在的動(dòng)態(tài)鏈接庫(kù)引用到配置文件的<extensions />區(qū)域即可,具體做法請(qǐng)參考這里。
配置文件的例子
這個(gè)配置文件設(shè)置過(guò)濾在10:00和12:59之間記錄的日志。很簡(jiǎn)單吧。
<nlog>
<extensions>
<add assembly="MyAssembly"/>
</extensions>
<targets>
<target name="console" type="Console"/>
</targets>
<rules>
<logger name="*" minLevel="Info" appendTo="console">
<filters>
<hourRange fromHour="10" toHour="12" action="Ignore"/>
</filters>
</logger>
</rules>
</nlog>
怎樣將配置參數(shù)傳遞給過(guò)濾器
看一下上面的例子,“FromHour”和“ToHour”這個(gè)兩個(gè)屬性就是兩個(gè)配置參數(shù)。只需在類中聲明公有屬性來(lái)保存配置參數(shù)就可以了。過(guò)濾器配置中的每一個(gè)參數(shù)都會(huì)被傳遞給正確的公有屬性。NLog支持integer,string,datetime和boolean類型的參數(shù)并會(huì)對(duì)類型進(jìn)行自動(dòng)轉(zhuǎn)換。參數(shù)都是大小寫(xiě)敏感的。
<filters> ... <hourRange fromHour="10" toHour="12" action="Ignore" /> ... </filters>
這里在配置過(guò)濾器的時(shí)候FromHour的值被設(shè)為10,ToHour的值被設(shè)為12。可以使用更多的參數(shù)來(lái)傳遞更多的屬性:
<filters> ... <hourRange p1="" p2="" p3="" p4="" pN="" action="Ignore" /> ... </filters>
需要一個(gè)專門(mén)的動(dòng)態(tài)鏈接庫(kù)嗎?
完全不必。可以調(diào)用FilterFactory.AddFilter()來(lái)通過(guò)程序注冊(cè)過(guò)濾器。不過(guò)必須保證注冊(cè)完成之前不能記錄任何日志信息。在<extensions />區(qū)域參照EXE可執(zhí)行文件是允許的。
static void Main(string[] args)
{ FilterFactory.AddFilter("MyFirst", typeof(MyNamespace.MyFirstFilter));
// start logging here }
Last updated: 2006-07-10 11:32:55
浙公網(wǎng)安備 33010602011771號(hào)