NLog文章系列——如何寫自定義布局生成器(Layout Renderer)
作者:Jaros?aw Kowalski <jaak@jkowalski.net>
翻譯:CrazyCoder(由衷感謝他的熱心!!)
原文:http://www.nlog-project.org/howto_write_layout_renderer.html
更多關于NLog的中文文章,請參考《NLog文章系列》。
為什么需要寫自定義布局生成器?
布局生成器能夠輸出程序的環境信息,因此能夠記錄更加豐富的調試信息。NLog為一些最常用的任務(如輸出環境變量、注冊表、線程id、程序根目錄等)設計了布局生成器。不過由于應用程序和框架各不相同,還是有必要開發自定義的布局生成器。
如何寫
只需要建立一個繼承自NLog.LayoutRenderer的類并重載Append()方法,在該方法中調用ApplyPadding(),這樣就可以得到按照已有布局生成器生成的格式化文本并送給產生最終輸出的StringBuilder。
例子
下面是一個輸出當前小時時間的布局生成器的框架代碼。編譯命令為:
csc.exe /t:library /out:MyAssembly.dll /r:NLog.dll MyFirstLayoutRenderer.cs
using System; using System.Text; using NLog; namespace MyNamespace { [LayoutRenderer("hour")] public sealed class HourLayoutRenderer: LayoutRenderer
{ private bool _showMinutes = false;
// 一個配置參數的示例public bool ShowMinutes
{ get { return _showMinutes; } set { _showMinutes = value; } }
protected override int GetEstimatedBufferSize(LogEventInfo ev)
{ // 最多需要兩位字符表示小時數 // 返回本布局生成器需要的緩沖區數 return 2; }
protected override void Append(StringBuilder builder, LogEventInfo ev)
{ // 得到當前的小時或分鐘數并轉為字符串,格式化 // 最終添加給指定的StringBuilder if (ShowMinutes) { builder.Append(ApplyPadding(DateTime.Now.Minute.ToString()));
}
else { builder.Append(ApplyPadding(DateTime.Now.Hour.ToString()));
}
}
}
}
如何使用自定義布局生成器
把生成器編譯到一個動態鏈接庫并在配置文件的<extensions />區域中引用它,具體用法請參考這里。
配置文件的例子
下面的例子能夠在所有日志之前加上系統當前的小時信息。的確很簡單吧?
<nlog>
<extensions>
<add assembly="MyAssembly"/>
</extensions>
<targets>
<target name="console" type="Console"
layout="${hour:showminutes=false} ${message}"/>
</targets>
<rules>
<logger name="*" minLevel="Info" appendTo="console"/>
</rules>
</nlog>
如何傳遞配置參數
看一下上面的例子,“ShowMinutes”這個屬性就是一個配置參數。只需在類中聲明公有屬性來保存配置參數就可以了。參數中間以以冒號分隔,如:
${hour:showminutes=true}這樣在加載配置信息時就會把ShowMinutes屬性的值設置為true。傳遞多個參數值需要用冒號逐一分開:
${layoutrenderername:par1=value1:par2=value2:par3=value3:...:parN=valueN}NLog支持integer,string,datetime和boolean類型的參數并會對類型進行自動轉換。
必須要放在新的動態鏈接庫里嗎?
完全不需要。你可以在程序中調用LayoutRendererFactory.AddLayoutRenderer()方法注冊你的布局生成器。不過必須保證注冊完成之前不能記錄任何日志信息。在<extensions />區域參照EXE可執行文件是允許的。
static void Main(string[] args)
{ LayoutRendererFactory.AddLayoutRenderer("hour", typeof(MyNamespace.MyFirstLayoutRenderer));
// start logging here }
Last updated: 2006-07-10 11:32:55
浙公網安備 33010602011771號