NLog文章系列——入门教程(转)
2011-10-08 23:29
281 查看
作者:JarosławKowalski<jaak@jkowalski.net>
翻译:DflyingChen:http://dflying.cnblogs.com/
原文:http://www.nlog-project.org/tutorial.html
本文为《NLog文章系列》的第二篇,将用实例程序演示用NLog书写日志的方法。
应用程序跟踪介绍
很久以前,在那个没有调试器,软件也大都是基于控制台的年代里,开发者习惯于使用printf()语句输出跟踪调试信息。而现在,世界发生了翻天覆地般的变化——printf()被Console.WriteLine()代替了……
翻译:DflyingChen:
原文:
本文为《
应用程序跟踪介绍
很久以前,在那个没有调试器,软件也大都是基于控制台的年代里,开发者习惯于使用printf()语句输出跟踪调试信息。而现在,世界发生了翻天覆地般的变化——printf()被Console.WriteLine()代替了……
我们都曾经书写过类似如下的代码:
staticvoidMain()
[code]{
Console.WriteLine("SuperAppstarted.");
DoSomething();
Console.WriteLine("SuperAppfinished.");
}
[/code]
上面这段代码中的Console.WriteLine()就是所谓的“跟踪”语句,因为这个语句除了输出当前程序的执行状态之外,并没有什么其他用处。由Console.WriteLine()的输出也叫做应用程序跟踪。在上面的例子中,这两条跟踪语句就用来告诉我们DoSomething()方法是否执行完毕。
在开发以及测试完成之后,我们可能会想要删除这些跟踪代码,以提高序执行效率(因为跟踪调试语句执行效率很低)。通常我们将这些跟踪语句注释掉,以便今后需要的时候可以方便地再次启用。可是不幸的是,将跟踪语句注释掉之后,我们还需要重新编译一遍程序。
或许有一天,在经历过第N次将无数的调试语句注释和取消注释之后,你会依稀感觉到这样并不是一个好的解决方案,并期待着这样的功能:
能够通过简单的方法控制显示哪些等级的跟踪信息(例如只显示警告和错误级别的跟踪信息,或是显示所有级别的跟踪信息等)。
将控制跟踪信息的显示与否的逻辑与应用程序的视线代码分开,跟踪信息的显示与否并不需要重新编译应用程序。
将跟踪信息写至文件、系统日志、消息队列……
能够将一些极为重要的信息通过Email发送给指定收信人,或是存放在数据库中。
更多你能想到的……
有些朋友可能觉得,在图形化调试器大行其道的当今软件开发环境中,这种书写日志的跟踪调试方式似乎用处非常有限。不过,当你的程序每一秒都被成千上万人同时访问,哪怕是停机一分钟都不能接受的时候,你就会知道这些调试信息对定位Bug来说意味着什么了(即所谓的“LiveSiteDebugging”)。
NLog是什么?
NLog(
NLog允许我们自定义从跟踪消息的来源(source)到记录跟踪信息的目标(target)的规则(rules)。记录跟踪信息的目标(target)可以为如下几种形式:
文件
文本控制台
数据库
网络中的其它计算机(通过TCP或UDP)
基于MSMQ的消息队列
Windows系统日志
其他形式,请参考
除此之外,每一条跟踪消息都可以自动带有上下文信息(contextualinformation),并将其发送给记录跟踪信息的目标。这些上下文信息可以包含如下内容:
当前的日期和时间(多种格式)
记录等级
来源名称
输出跟踪消息的方法的堆栈信息
环境变量的值
异常的详细信息
计算机、进程和线程名称
其他,请参考:
每条跟踪信息都包含一个记录等级(loglevel)信息,用来描述该条信息的重要性。NLog支持如下几种记录等级:
Trace-最常见的记录信息,一般用于普通输出
Debug-同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
Info-信息类型的消息
Warn-警告信息,一般用于比较重要的场合
Error-错误信息
Fatal-致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。
NLog是一个免费的、基于
配置文件模板
NLog配置文件智能感知支持
代码片断(codesnippet)
集成至“AddReference...”对话框
我们的第一个NLog应用程序
接下来让我们用VisualStudio2005创建第一个使用NLog的应用程序。该示例程序将从把日志输出到控制台开始,并不断添加新的功能,以演示在NLog中对日志进行配置的方法。
首先在VisualStudio2005中创建一个新项目(本示例程序将使用C#演示),然后在“AddNewItem...”对话框中为该程序添加一个NLog配置文件。这里我们选择“EmptyNLogConfigurationFile”,并命名为“NLog.config"”:
注意到NLog.dll的引用被自动添加到了我们的项目中。刚刚添加的NLog.config文件的内容如下,这也正是我们在本示例程序中将要配置的:
<nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"
[code]xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
</targets>
<rules>
</rules>
</nlog>
[/code]
接下来需要一个额外的步骤:设置该配置文件的“CopyToOutputDirectory”选项为“Copyalways”。这样该配置文件将自动被部署到*.exe所在的目录下。这样以后,无需任何设置,NLog即可自动搜寻到并加载该配置文件。
接下来让我们配置一下日志的输出,在<targets/>节中,添加一个新条目让日志输出到控制台中,并添加必要的输出布局(layout):
<targets>
[code]<targetname="console"xsi:type="Console"
layout="${longdate}|${level}|${message}"/>
</targets>
[/code]
在输入上述代码时,可以看到VisualStudio的智能感知功能发挥了作用:输入xsi:之后,将得到当前可用的输出目标列表:
然后,我们要在<rules/>节中添加必要的规则,将所有记录等级等于或高于Debug的信息输出至控制台。这段XML配置文件字解释能力足够强,无需多言:
<rules>
[code]<loggername="*"minlevel="Debug"writeTo="console"/>
</rules>
[/code]
若希望生成并输出诊断信息,我们还需要添加一个Logger对象。Logger对象的方法名和记录等级的名称一样(Debug()、Info()、Fatal()……)。Logger对象是通过LogManager对象创建的。建议Logger对象的名称和程序的类名保持一致。调用LogManager的GetCurrentClassLogger()方法即可自动为当前类创建一个Logger对象。
接下来开始修改VisualStudio自动生成的这个C#文件。首先在文件头部添加“usingNLog”语句,引入NLog程序集的命名空间。然后添加创建Logger对象的代码,注意在这里我们可以使用随NLog的安装而添加的VisualStudio的代码片断:输入“nlogger”,然后按两次Tab键即可。
usingSystem;
[code]usingSystem.Collections.Generic;
usingSystem.Text;
usingNLog;
namespaceNLogExample
{
classProgram
{
privatestaticLoggerlogger=LogManager.GetCurrentClassLogger();
staticvoidMain(string[]args)
{
logger.Debug("HelloWorld!");
}
}
}
[/code]
运行该程序,将看到一条日志信息输出到了控制台,该信息包含当前的时间,记录等级,以及“HelloWorld”消息。
最后,让我们总结一下实现该功能的步骤:
用
通过调用Logger对象的Debug()方法,发出一条Debug记录等级的诊断信息。
因为记录等级和消息来源符合配置文件中的<rules/>声明,所以该消息将以指定的布局(layout)格式化后输出到控制台中。
稍微复杂一些的场景
接下来让我们将这些日志信息,包括其中的一些上下文信息(例如堆栈信息等),输出到文件和命令行两个地方。要实现这个需求,我们只要修改NLog的配置文件,并添加一个类型为“File”的目标即可。
<nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"
[code]xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<targetname="console"xsi:type="ColoredConsole"
layout="${date:format=HH\:mm\:ss}|${level}|${stacktrace}|${message}"/>
<targetname="file"xsi:type="File"fileName="${basedir}/file.txt"
layout="${stacktrace}${message}"/>
</targets>
<rules>
<loggername="*"minlevel="Trace"writeTo="console,file"/>
</rules>
</nlog>
[/code]
接下来这段C#代码生成了更多的日志信息,还使用了NLog提供的一些其他方法用来输出堆栈信息。
staticvoidC()
[code]{
logger.Info("InfoCCC");
}
staticvoidB()
{
logger.Trace("TraceBBB");
logger.Debug("DebugBBB");
logger.Info("InfoBBB");
C();
logger.Warn("WarnBBB");
logger.Error("ErrorBBB");
logger.Fatal("FatalBBB");
}
staticvoidA()
{
logger.Trace("TraceAAA");
logger.Debug("DebugAAA");
logger.Info("InfoAAA");
B();
logger.Warn("WarnAAA");
logger.Error("ErrorAAA");
logger.Fatal("FatalAAA");
}
staticvoidMain(string[]args)
{
logger.Trace("ThisisaTracemessage");
logger.Debug("ThisisaDebugmessage");
logger.Info("ThisisanInfomessage");
A();
logger.Warn("ThisisaWarnmessage");
logger.Error("ThisisanErrormessage");
logger.Fatal("ThisisaFatalerrormessage");
}
[/code]
运行该程序,如下日志信息将被写入应用程序所在目录中的“file.txt”文件中。
Program.MainThisisaTracemessage
[code]Program.MainThisisaDebugmessage
Program.MainThisisanInfomessage
Program.Main=>Program.ATraceAAA
Program.Main=>Program.ADebugAAA
Program.Main=>Program.AInfoAAA
Program.Main=>Program.A=>Program.BTraceBBB
Program.Main=>Program.A=>Program.BDebugBBB
Program.Main=>Program.A=>Program.BInfoBBB
Program.A=>Program.B=>Program.CInfoCCC
Program.Main=>Program.A=>Program.BWarnBBB
Program.Main=>Program.A=>Program.BErrorBBB
Program.Main=>Program.A=>Program.BFatalBBB
Program.Main=>Program.AWarnAAA
Program.Main=>Program.AErrorAAA
Program.Main=>Program.AFatalAAA
Program.MainThisisaWarnmessage
Program.MainThisisanErrormessage
Program.MainThisisaFatalerrormessage
[/code]
同时,控制台中也输出了如下漂亮的日志信息。
再来修改一下配置文件——开发中一个很常见的需求就是让不同记录等级的日志输出到不同的目标中。例如,让记录等级等于或高于Info的信息输出至控制台,同时将任意记录等级的信息都存放在文件中保存。在NLog中,实现这个需求只要修改配置文件的<rules/>节即可,无需修改应用程序。
<rules>
[code]<loggername="*"minlevel="Info"writeTo="console"/>
<loggername="*"minlevel="Trace"writeTo="file"/>
</rules>
[/code]
再次运行程序,可以看到Trace和Debug等级的信息只出现在了文件中,而并不显示在控制台中。
(待续……)
相关文章推荐
- NLog文章系列——入门教程(下)
- NLog文章系列——入门教程(下)
- NLog文章系列——入门教程(上)
- NLog文章系列——入门教程(中)
- NLog文章系列——入门教程(上)
- NLog文章系列——入门教程(中)
- 系列文章 -- OpenCV入门教程
- SharePoint 2013 入门教程--系列文章
- SharePoint 2013 入门教程--系列文章
- J2ME Mobile 3D入门教程系列文章之一
- 系列文章 -- OpenCV入门教程
- J2ME Mobile 3D入门教程系列文章之二
- 系列文章--ASP.NET之AJAX入门教程
- 系列文章--SharePoint 2013 Designer 入门教程
- 收集的RxJava 2.x入门教程系列专栏,文章链接
- 系列文章--oracle简单入门教程
- [新手入门]快速学习 ADO.NET Entity Framework系列文章 #1~#2
- Visual Studio2005入门.Net系列视频教程 thc123系列(网易学院)
- AngularJs学习笔记--Guide教程系列文章索引
- ArcGIS Python API可视化及分析系列教程(一):入门与简介(2)安装与配置