NLog文章系列——如何写自定义布局生成器(Layout Renderer)
2006-12-22 23:36
519 查看
作者:JarosławKowalski<jaak@jkowalski.net>
翻译:CrazyCoder(由衷感谢他的热心!!)原文:http://www.nlog-project.org/howto_write_layout_renderer.html更多关于NLog的中文文章,请参考《NLog文章系列》。
为什么需要写自定义布局生成器?
布局生成器能够输出程序的环境信息,因此能够记录更加丰富的调试信息。NLog为一些最常用的任务(如输出环境变量、注册表、线程id、程序根目录等)设计了布局生成器。不过由于应用程序和框架各不相同,还是有必要开发自定义的布局生成器。如何写
只需要建立一个继承自
下面是一个输出当前小时时间的布局生成器的框架代码。编译命令为:
.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/>区域中引用它,具体用法请参考这里。
配置文件的例子
下面的例子能够在所有日志之前加上系统当前的小时信息。的确很简单吧?
.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;}
如何传递配置参数
看一下上面的例子,“ShowMinutes”这个属性就是一个配置参数。只需在类中声明公有属性来保存配置参数就可以了。参数中间以以冒号分隔,如:
这样在加载配置信息时就会把ShowMinutes属性的值设置为true。传递多个参数值需要用冒号逐一分开:
NLog支持integer,string,datetime和boolean类型的参数并会对类型进行自动转换。
必须要放在新的动态链接库里吗?
完全不需要。你可以在程序中调用LayoutRendererFactory.AddLayoutRenderer()方法注册你的布局生成器。不过必须保证注册完成之前不能记录任何日志信息。在<extensions/>区域参照EXE可执行文件是允许的。
Lastupdated:2006-07-1011:32:55
翻译:
为什么需要写自定义布局生成器?
布局生成器能够输出程序的环境信息,因此能够记录更加丰富的调试信息。NLog为一些最常用的任务(如输出环境变量、注册表、线程id、程序根目录等)设计了布局生成器。不过由于应用程序和框架各不相同,还是有必要开发自定义的布局生成器。如何写
只需要建立一个继承自
NLog.LayoutRenderer的类并重载
Append()方法,在该方法中调用
ApplyPadding(),这样就可以得到按照已有布局生成器生成的格式化文本并送给产生最终输出的
StringBuilder。例子
下面是一个输出当前小时时间的布局生成器的框架代码。编译命令为:
csc.exe/t:library/out:MyAssembly.dll/r:NLog.dllMyFirstLayoutRenderer.cs
usingSystem;
usingSystem.Text;
usingNLog;
namespaceMyNamespace
{
[LayoutRenderer("hour")]
publicsealedclassHourLayoutRenderer:LayoutRenderer
{
privatebool_showMinutes=false;
//一个配置参数的示例
publicboolShowMinutes
{
get{return_showMinutes;}
set{_showMinutes=value;}
}
protectedoverrideintGetEstimatedBufferSize(LogEventInfoev)
{
//最多需要两位字符表示小时数
//返回本布局生成器需要的缓冲区数
return2;
}
protectedoverridevoidAppend(StringBuilderbuilder,LogEventInfoev)
{
//得到当前的小时或分钟数并转为字符串,格式化
//最终添加给指定的StringBuilder
if(ShowMinutes)
{
builder.Append(ApplyPadding(DateTime.Now.Minute.ToString()));
}
else
{
builder.Append(ApplyPadding(DateTime.Now.Hour.ToString()));
}
}
}
}
.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/>区域中引用它,具体用法请参考
配置文件的例子
下面的例子能够在所有日志之前加上系统当前的小时信息。的确很简单吧?
<nlog>
<extensions>
<addassembly="MyAssembly"/>
</extensions>
<targets>
<targetname="console"type="Console"
layout="${hour:showminutes=false}${message}"/>
</targets>
<rules>
<loggername="*"minLevel="Info"appendTo="console"/>
</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;}
如何传递配置参数
看一下上面的例子,“ShowMinutes”这个属性就是一个配置参数。只需在类中声明公有属性来保存配置参数就可以了。参数中间以以冒号分隔,如:
${hour:showminutes=true}
这样在加载配置信息时就会把ShowMinutes属性的值设置为true。传递多个参数值需要用冒号逐一分开:
${layoutrenderername:par1=value1:par2=value2:par3=value3:...:parN=valueN}
NLog支持integer,string,datetime和boolean类型的参数并会对类型进行自动转换。
必须要放在新的动态链接库里吗?
完全不需要。你可以在程序中调用LayoutRendererFactory.AddLayoutRenderer()方法注册你的布局生成器。不过必须保证注册完成之前不能记录任何日志信息。在<extensions/>区域参照EXE可执行文件是允许的。
staticvoidMain(string[]args)
{
LayoutRendererFactory.AddLayoutRenderer("hour",typeof(MyNamespace.MyFirstLayoutRenderer));
//startlogginghere
}
Lastupdated:2006-07-1011:32:55
相关文章推荐
- NLog文章系列——如何编写自定义的过滤器(Filter)
- NLog文章系列——如何配置NLog
- NLog文章系列——如何优化日志性能
- NLog文章系列——入门教程(中)
- NLog文章系列——入门教程(下)
- NLog文章系列——如何配置NLog
- NLog文章系列——如何配置NLog
- NLog文章系列——如何配置NLog
- NLog文章系列——如何配置NLog(转)
- NLog文章系列——系列文章目录以及简要介绍
- NLog文章系列——如何配置NLog
- learn-with-open-source 如何进行开源社区的学习系列经典文章
- 浏览器是如何工作的系列:页面布局
- 如何在 Word 中使用自定义样式生成文章目录
- 现代软件工程系列 学生的精彩文章 (3) 如何在Bug 不断的情况下还能保持平常心... [zz]
- Ecshop文章分类列表页如何自定义Title
- 【黑金ZYNQ7000系列原创视频教程】07.自定义IP——定制RTC IP实验
- web数据采集核心技术分享系列(二)如何提取信息?字符串?正则?xpath?xslt?自定义?...什么才是王道?
- 如何将 Android带入互联网数字家庭? 系列文章第四篇
- Ecshop文章分类列表页如何自定义Title以提高SEO效果