NLog快速使用

安装 NLog

NLog 能够从官网或者NuGet下载。无论是源码包或者是已经编译好的都可以。如果是第一次使用,建议下载安装包(msi或者exe文件)。

如果你是从NuGet下载的,要记住同时把NLog.config下载下来

当你安装好NLog以后。在VisualStudio中就能够找到NLog的程序集和API文档,包括以下内容:

  • Item Templates - 用于快速创建NLog的配置文件
  • Code Snippets - 用于快速书写NLog代码,创建NLog实体
  • NLog.xsd 文件用于在NLog配置文件中提供智能提示

在应用中添加NLog

让我们在 Visual Studio中创建一个新的控制台程序。

为了在应用中添加NLog,我们必须引用NLog.dll和NLog配置文件。你引用NLog配置文件的时候,会自动引用NLog.dll。好了,让我们开始,右击你的项目,选择“新建项”。

从左边的列表中,选择NLog类别,选择“ Empty NLog Configuration File”,添加。

这将添加对NLog.dll的引用和一个空的配置文件。为了将NLog的配置文件拷贝到应用程序的目录,我们需要选中配置文件,右击"属性”,把“复制到输出目录”改为“始终复制”。

OK,现在你可以在应用中使用NLog了。

Logging API

为了记录应用的日志信息,你需要使用Logging API。这里有两个类你会常常使用:Logger和LogManager,他们都在NLog命名空间下。Logger负责日志的交互,LogManager复制创建和管理Logger实体。

有一点需要明白,Logger并不负责日志的输出(就是他不会直接关联到日志文件)。他仅仅是一个源头,对应程序中的一段代码。真正的日志输出方式,是在Configuration文件或者Configuration API中配置的。明白了这点,你就知道了在代码中维护日志的状态,通过配置,很容易的就可以改变日志的输出方式。

创建 loggers

许多的应用在每一个类中都创建了一个Logger,Logger的名字和类名一致。 前面说过,你需要使用LogManager 创建Logger 实体。创建一个给定名称的Logger:

using NLog;

Logger logger = LogManager.GetLogger("MyClassName");

在大部分的情况下,每个类都共用一个Logger,就像每个类创建Logger的时候都都用了相同的名称。 LogManager提供了一个方法为当前类创建Logger,叫做 GetCurrentClassLogger()。 因为 loggers是线程安全的,你能够非常容易的创建一个Logger,然后把他存放在一个静态变量中:

namespace MyNamespace
{
  public class MyClass
  {
    private static Logger logger = LogManager.GetCurrentClassLogger();
  }
}

 

Log 等级

每一条日志信息都关联到了一个日志等级。他标明了日志信息的重要程度和详细程度。 NLog能够根据Logger的名称和日志的等级,来路由到不同的输出方式。

NLog 支持以下的等级

  • Trace - 最详细的日志,包括了大量的信息,比如负载信息。这个日志等级只有在development环境中才会被打开;
  • Debug - debugging 信息,比trace的详细程度稍差。这个等级不能用于生产环境;
  • Info - information 信息,常在生产环境中使用;
  • Warn - warning 信息,非关键性错误,能够被修复或者是暂时的问题;
  • Error - 错误信息
  • Fatal - 非常严重的错误信息

提交日志信息

Logger提供了6了方法来提交日志:Trace()Debug()Info()Warn()Error() , Fatal(),Log()。Log()方法提供了一个参数,来标明日志等级。

using NLog;

public class MyClass
{
  private static Logger logger = LogManager.GetCurrentClassLogger();

  public void MyMethod1()
  {
    logger.Trace("Sample trace message");
    logger.Debug("Sample debug message");
    logger.Info("Sample informational message");
    logger.Warn("Sample warning message");
    logger.Error("Sample error message");
    logger.Fatal("Sample fatal error message");

    // alternatively you can call the Log() method 
    // and pass log level as the parameter.
    logger.Log(LogLevel.Info, "Sample informational message");
  }
}

日志信息能够使用参数化写法 -你能够使用和string.format()方法相同的语法来格式化日志信息:

using NLog;

public class MyClass
{
  private static Logger logger = LogManager.GetCurrentClassLogger();

  public void MyMethod1()
  {
    int k = 42;
    int l = 100;

    logger.Trace("Sample trace message, k={0}, l={1}", k, l);
    logger.Debug("Sample debug message, k={0}, l={1}", k, l);
    logger.Info("Sample informational message, k={0}, l={1}", k, l);
    logger.Warn("Sample warning message, k={0}, l={1}", k, l);
    logger.Error("Sample error message, k={0}, l={1}", k, l);
    logger.Fatal("Sample fatal error message, k={0}, l={1}", k, l);
    logger.Log(LogLevel.Info, "Sample informational message, k={0}, l={1}", k, l);
  }
}

注:你应该避免使用string.formatting来格式化日志信息。因为格式化日志信息是一个耗时的操作,使用NLog的格式化,它能够在真正开始写入日志的时候,才格式化日志信息,提高了程序效率。

配置文件

上面,我们学习了如何在代码中提交日志信息,但是我们还没有配置任何的输出方式。所以,当你执行上面的代码,你会发现,什么都没有发生(没有记录日志)。现在,让我们打开NLog.config文件,加入下面配置:

  1. 在 <targets> 节点,添加:
<target name="logfile" xsi:type="File" fileName="file.txt" /> 

This will define a target which will send logs to a file named file.txt.

  1. 在 <rules> 节点,添加
<logger name="*" minlevel="Info" writeTo="logfile" /> 

这段配置会将所有的(name="*")且具有Info或以上等级(InfoWarnError 和Fatal)的日志,通过“logfile”target来输出,及输出到bin文件夹下的file.txt文件中。

注意,如果你是在 Visual Studio中编辑,会出现智能提示。最后的配置如下:

<?xml version="1.0" encoding="utf-8" ?> 
<targets
    <target name="logfile" xsi:type="File" fileName="file.txt" /> 
</targets
<rules
    <logger name="*" minlevel="Info" writeTo="logfile" /> 
</rules
</nlog>

 

 

现在,你执行程序,会发现bin目录下面多了一个file.txt文件

多个 targets

让我们尝试一下更复杂的配置。假设你想输出日志到一个文件,同时输出到控制台。应该像下面这样配置:

<?xml version="1.0" encoding="utf-8" ?>
<targets
    <target name="logfile" xsi:type="File" fileName="file.txt" /> 
    <target name="console" xsi:type="Console" /> 
</targets
<rules
    <logger name="*" minlevel="Trace" writeTo="logfile" /> 
    <logger name="*" minlevel="Info" writeTo="console" /> 
</rules
</nlog>

 

特殊处理

一个常见的需求,就是某些日志只在部分组件中记录。我们可以通过下面的配置实现:

<?xml version="1.0" encoding="utf-8" ?> 
<targets
    <target name="logfile" xsi:type="File" fileName="file.txt" /> 
</targets
<rules
    <logger name="SomeNamespace.Component.*" minlevel="Trace" writeTo="logfile" final="true" /> 
    <logger name="*" minlevel="Info" writeTo="logfile" /> 
</rules
</nlog>

 

 

第一条规则定义了组件“SomeNamespace.Component.*”通过“logfile”来发送日志,最小日志等级是Trace。特性final="true" 表明了,执行了这条规则后,就不执行后面的匹配规则。

第二条规则定义了所有日志等级高于等于Info的日志信息的记录方式。

Wrappers

NLog提供了一种特殊的trager,用于配置其他日志的输出行为,这种标签被称为wrappers:

还有更多的Wrapper,请参考官方文档

为了使用Wrapper,在一个<target />块中,标明使用的Wrapper,并配置一种日志输出方式。在<rules/> 块中,调用这个Wrapper:

<?xml version="1.0" encoding="utf-8" ?> 
    <targets
        <target name="asyncFile" xsi:type="AsyncWrapper"
            <target name="logfile" xsi:type="File" fileName="file.txt" /> 
        </target
    </targets
    <rules
        <logger name="*" minlevel="Info" writeTo="asyncFile" /> 
    </rules
</nlog>

 

这个配置将实现日志的异步写入。

Layouts

布局提供了一种方式来格式化日志的输出。主要有两种布局

  • 简单布局 - 由Layout Renderers组成
  • 结构化布局 - 输出XML、CSV等等其他的复杂格式

简单布局输出一个字符串,在 ${ 和 }中写入特殊的标记。比如下面的布局声明,会将日志的输出日期格式化为 yyyyMMddHHmmss:

 

<target name="logfile" xsi:type="File" fileName="file.txt" layout="${date:format=yyyyMMddHHmmss} ${message}" />

 

 
posted @ 2014-10-30 15:30  争世不悔  阅读(1815)  评论(0编辑  收藏  举报