在性能代码性能优化的时候,马丹妹给予指导时,用了日志测试时间这个技术,很是吸引人,而且她也写了系列博客,看了师姐的博客后实践,然后写一篇简单的博客。
师姐系列博客地址:http://blog.csdn.net/u010176014/article/category/5834015
NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。NLog完全实现了我们上面的期望目标,并且还远远不止这些……
NLog允许我们自定义从跟踪消息的来源(source)到记录跟踪信息的目标(target)的规则(rules)。记录跟踪信息的目标(target)可以为如下几种形式:
1.文件
2.文本控制台
3.Email
4.数据库
5.网络中的其它计算机(通过TCP或UDP)
6.基于MSMQ的消息队列
7.Windows系统日志
除此之外,每一条跟踪消息都可以自动带有上下文信息(contextual information),并将其发送给记录跟踪信息的目标。这些上下文信息可以包含如下内容:
1.当前的日期和时间(多种格式)
2.记录等级
3.来源名称
4.输出跟踪消息的方法的堆栈信息
5.环境变量的值
6.异常的详细信息
7.计算机、进程和线程名称
8.其他
每条跟踪信息都包含一个记录等级(log level)信息,用来描述该条信息的重要性。NLog支持如下几种记录等级:
Trace - 最常见的记录信息,一般用于普通输出
Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
Info - 信息类型的消息
Warn - 警告信息,一般用于比较重要的场合
Error - 错误信息
Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。
现在用实例来说明:
一、输出到控制台
第一步:添加对NLog的引用
共添加两个文件,下图所示
方法1、Nuget:
方法2:、菜单中工具-库程序包管理器-程序包管理器控制台,输入Install-Package NLog和Install-Package NLog.config即可
引用成功后结果:
第二步:配置NLog.config文件
NLog.config中共包含两个节点,targets和rules。我们需要配置的也是这两个节点
代码如下:
<span style="font-size:18px;"><?xml version="1.0"encoding="utf-8" ?>
<nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsdNLog.xsd" autoReload="true" throwExceptions="false" internalLogLevel="Off"internalLogFile="c:\temp\nlog-internal.log" > <!-- optional, add some variabeles https://github.com/nlog/NLog/wiki/Configuration-file#variables --> <variable name="myvar" value="myvalue"/> <targets> <!--添加一个新条目让日志输出到控制台中,并添加必要的输出布局(layout)--> <target name="console" xsi:type="Console"layout="${longdate}|${level}|${message}"/> <!--说明 xsi:type="Console"指定输出到控制台;layout指定输出文件内容的样式${longdate}是日期(具体到毫秒),${level}是日志的等级;${message}是具体要输出的内容。--> </targets> <rules> <!--添加必要的规则--> <logger name="*" writeTo="console"/> <!--我个人设置的规则是,将所有记录的信息输出至控制台--> </rules>
</nlog></span>
第三步:输出
<span style="font-size:18px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using NLog;
namespace ConsoleApplication1
{class Program{private static Logger logger = LogManager.GetCurrentClassLogger();//建立一个日志对象static void Main(string[] args){logger.Trace("输出一条记录信息成功!");//最常见的记录信息,一般用于普通输出 logger.Debug("输出一条Debug信息成功!"); //同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序 logger.Info("输出一条消息类型信息成功!");//信息类型的消息 logger.Warn("输出一条警告信息成功");//警告信息,一般用于比较重要的场合 logger.Error("输出一条错误信息成功!");//错误信息 logger.Fatal("输出一条致命信息成功!");//致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。}}
}</span>
执行结果:
2、输出到文件:
其它不变,只是修改NLog.config配置文件:
<span style="font-size:18px;"><targets> <!--说明 xsi:type="File"指定输出到文件类型;fileName指定输出文件的存放位置和文件名(可自定义),其中 ${basedir}是程序所在的路径; ${shortdate}是日期(具体到日)。 layout指定输出文件内容的样式 ${level}是日志的等级; ${longdate}是日期(具体到毫秒), ${message}是具体要输出的内容。--> <target name="Info" xsi:type="File"fileName="${basedir}/log/test.${shortdate}.log"layout="${longdate} [${level}]: ${message}"/> </targets> <rules> <logger name="*" writeTo="Info"/> </rules></span>
结果是:
3、输出到数据库:
配置文件修改为:
<span style="font-size:18px;"><?xml version="1.0"encoding="utf-8" ?>
<nlogxmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsdNLog.xsd"autoReload="true"throwExceptions="false"internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log"><!-- optional, add some variabeleshttps://github.com/nlog/NLog/wiki/Configuration-file#variables--><variable name="myvar" value="myvalue"/><!--Seehttps://github.com/nlog/nlog/wiki/Configuration-fileforinformation on customizing logging rules and outputs.--><targets><!--add your targets hereSee https://github.com/nlog/NLog/wiki/Targets for possible targets.See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possiblelayout renderers.--><!--添加一个新条目让日志输出到控制台中,并添加必要的输出布局(layout)--><!--<target name="console" xsi:type="Console"layout="${longdate}|${level}|${message}"/>--><!--说明 xsi:type="Console"指定输出到控制台;layout指定输出文件内容的样式${longdate}是日期(具体到毫秒),${level}是日志的等级;${message}是具体要输出的内容。--><!--Writing events to the a file with the date in the filename.--><!--<target name="Info" xsi:type="File"fileName="${basedir}/log/test.${shortdate}.log"layout="${longdate} [${level}]:${message}"/>--><target xsi:type="Database" name="database"connectionString=" Data Source=(local);InitialCatalog=NLogtest;Persist Security Info=True; User ID=sa;Password=123456"commandText="insert into NLog_Log([CreateOn],[Origin],[LogLevel],[Message], [Exception],[StackTrace]) values (getdate(), @origin, @logLevel,@message,@exception, @stackTrace)"><!--日志来源--><parameter name="@origin" layout="${callsite}"/><!--日志等级--><parameter name="@logLevel"layout="${level}"/><!--日志消息--><parameter name="@message"layout="${message}"/><!--异常信息--><parameter name="@exception"layout="${exception}" /><!--堆栈信息--><parameter name="@stackTrace"layout="${stacktrace}"/></target></targets><rules><!-- add your logging rules here --><!--<logger name="*" writeTo="Info"/>--><logger name="*" minlevel="Debug"writeTo="database"/><!--Write all events with minimal level of Debug (So Debug, Info, Warn,Error and Fatal, but not Trace) to"f"<logger name="*" minlevel="Debug"writeTo="f" />--></rules>
</nlog> </span>
结果是: