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文件,加入下面配置:
- 在 <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.
- 在 <rules> 节点,添加
<logger name="*" minlevel="Info" writeTo="logfile" />
这段配置会将所有的(name="*")且具有Info或以上等级(Info, Warn, Error 和Fatal)的日志,通过“logfile”target来输出,及输出到bin文件夹下的file.txt文件中。
注意,如果你是在 Visual Studio中编辑,会出现智能提示。最后的配置如下:
<? xml version = "1.0" encoding = "utf-8" ?> < nlog xmlns = "http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > < 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" ?> < nlog xmlns = "http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > < 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" ?> < nlog xmlns = "http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > < 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:
- ImpersonatingWrapper - Impersonates another user for the duration of the write.
- AsyncWrapper - 提供了日志的异步写入
- FallbackGroup - Provides fallback-on-error.
- FilteringWrapper - Filters log entries based on a condition.
还有更多的Wrapper,请参考官方文档
为了使用Wrapper,在一个<target />块中,标明使用的Wrapper,并配置一种日志输出方式。在<rules/> 块中,调用这个Wrapper:
<? xml version = "1.0" encoding = "utf-8" ?> < nlog xmlns = "http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" > < 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}" /> |