NLog 教程

内容

安装NLog

ASP.NET Core 用户最好先 follow Getting started with ASP.NET Core

NLog可以在NuGet中下载.

如果仅仅安装 NLog.Config 包,会一并安装 NLog 和 NLog.Schema 两个包,这将使得启动配置和智能感知。

使用 GUI 或 在程序包管理控制台中使用以下命令

Install-Package NLog.Config

好了,你现在可以编译和运行你自己的应用了,它能使用NLog的功能了.

配置NLog输出的Targets

如果配置了一个(或者更多)NLog targets , NLog 仅会产出对应项.

NLog 可以使用一个 NLog.config 的 XML 配置文件去配置你的应用程序(文件的属性需修改为:始终复制),下面是一个简单 NLog.config 配置内容.

<?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="logconsole" xsi:type="Console" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logconsole" />
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>

注: 其中 targets 表示写入的方式,上方 logfile 表示使用txt文件的方式记录,logconsole 表示在控制台中记录(在控制台中直接输出),rules 表示写入方式对应的规则

也可以使用代码的方式进行配置,例如如下的代码:

var config = new NLog.Config.LoggingConfiguration();

var logfile = new NLog.Targets.FileTarget() { FileName = "file.txt", Name = "logfile" };
var logconsole = new NLog.Targets.ConsoleTarget() { Name = "logconsole" };

config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Info, logconsole));
config.LoggingRules.Add(new NLog.Config.LoggingRule("*", LogLevel.Debug, logfile));

NLog.LogManager.Configuration = config;

也可以参考 Configuration File 或者 Configuration API

详细信息: Targets

写入日志信息

如何获取记录器并向日志记录器写入消息的示例:

var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("Hello World");

如果已经正确的配置了NLog targets,上面的代码会输出信息到配置的targets中.

logger 有一个name,它可以在logging-rules(参见上面的配置示例中的name="*")用于重定向到需要的targets。

当使用 NLog.LogManager.GetCurrentClassLogger() 时,它会创建一个名字为调用类名称(包括命名空间)的 logger .还可以通过使用指定一个显式名称. NLog.LogManager.GetLogger("MyLogger").

logger 可以使用不同的 LogLevels ,它可以在logging-rules(参见上面的配置示例中的 minLevel)配置,用户有相关的信息被重定向到 targets 中:

logger 没有绑定到特定的目标。写入到一个logger 的消息可以根据logging-rules中配置,从而可以写入到多个目标中。保持这种分离可以让你在代码中保留日志记录,并且可以通过在一个地方更新配置来轻松地更改日志的编写方式和位置。还可以查看过滤日志消息。

日志等级

每一个记录的信息都有一个对应的日志等级,表示这个记录信息的重要程度或详细程度。NLog 可以根据日志消息的名称和日志级别来路由日志消息。

NLog 支持以下的 记录日志等级:

  • Trace - 非常详细的日志,包含最详尽的信息,例如协议的有效载荷. 该日志等级通常仅在开发过程中被使用;
  • Debug - 调试信息,详尽信息次于 Trace ,在生产环境中通常不启用;
  • Info - 信息消息, 通常在生产环境中通常启用;
  • Warn - 警告信息,通常用于非关键问题,这些问题可以恢复,或者是暂时的故障;
  • Error - 错误信息 - 多数情况下记录Exceptions(异常)信息;
  • Fatal - 非常严重的错误!
public class MyClass
{
  private static NLog.Logger logger = NLog.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");
  }
}

布局和布局渲染器

布局和布局渲染器 可以配置日志消息如何写入NLog targets.

下面展示了一个大多数 NLog targets 使用的简单布局方式 SimpleLayout :

<target name="logfile" xsi:type="File" fileName="file.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${message}" />

也可以进行相应的配置,以获取更详尽的信息:

<target name="logfile" xsi:type="File" fileName="file.txt" layout="${longdate}|${level:uppercase=true}|${logger}|${threadid}|${message}|${exception:format=tostring}" />

更详尽信息,参考 Layout Renderers

你也可以使用更复杂的布局,而不是简单的布局:

更详尽信息,参考: Layouts

日志最佳实践

  1. 每个类中,Logger 应该被设置成一个静态变量
    每创建一个 Logger 都会有一定的性能损耗,因为它必须获取锁和分配对象
    因此建议像这样创建logger:
namespace MyNamespace
{
  public class MyClass
  {
    private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
  }
}
  1. Logger 应该处理字符串格式化
    避免预先执行字符串分配或字符串连接,而是让日志记录器执行格式化。这将允许NLog推迟格式化并减少开销。

因此,建议您这样执行日志:

logger.Info("Hello {0}", "Earth");
  1. Logger 应该记录异常
    避免将异常作为格式化参数,而是将其显式地作为第一个参数提供。这将帮助NLog目标提供更好的日志记录。
try
{
}
catch (Exception ex)
{
    logger.Error(ex, "Something bad happened");
}
  1. 从 NLog.config XML配置文件中验证配置
    默认情况下,NLog 允许记录所有异常,因此,日志记录的问题不会导致应用程序中断。但是为更多的应用程序记录日志是至关重要的,所以如果 NLog 配置文件的实例错误,那将是致命的.

增加 throwConfigExceptions="true" 会使 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"
      throwConfigExceptions="true">
</nlog>

类似的有 throwExceptions="true", 但它不能在生产环境中使用,因为它会对应用程序造成破坏. 它被设计用在单元测试、本地故障排除中.详见Troubleshooting Configuration

  1. Remember to Flush
    当应用停止运行时,NLog 默认会自动尝试刷新. Microsoft Windows 给.Net应用程序在被终止前执行关机(通常是2秒)的时间。如果一个 NLog配置了需要网络传输的 NLog Tagets (Http、Mail、Tcp)运行在Linux/Windows,那么执行一个手动的 Flush/Shutdown 是一个明智之举.
NLog.LogManager.Shutdown(); // 刷新并关闭内部线程和计时器。

运行在Mono/Linux 的 .NET 应用在进入应用程序关闭阶段前,必需去停止线程和计时器. 如果未执行完成会导致未处理的异常和分割错误,以及其他不可预知的行为。

封装器

NLog 支持特殊类型的 targets ,这些类自己本身不做任何日志记录,但是会修改其它 loggers 的行为. 这些loggers被称为封装器. 一般常用的是:

  • AsyncWrapper - 提供异步方式缓冲执行目标写入,可以提高性能;
  • BufferingWrapper - 简单批处理日志信息. 可能仅在某些日志事件发生时才发送批处理(例如 异常信息);
  • FallbackGroup - 提供错误回滚;
  • RetryingWrapper - 提供错误重试操作;

详见 : Target Wrappers

AsyncWrapper 提供一个便捷的快捷设置方式,在配置文件中添加 async="true" 即可:

<?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 async="true">
        <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>

    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>
</nlog>

这样设置之后,所有写入文件的日志将以异步的方式,可以提高调用线程的响应能力。

参考资料:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342