使用NLog的最佳实践

1. Logger应该在每个类中初始化为静态

创建一个新的Logger类是有有开销的,因为它需要获取一些锁和分配对象和内存。

因此推荐像下面一样使用Logger:

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

2. 应该让Logger处理字符串格式化

避免提前执行字符串分配或字符串连接,而是让Logger来完成字符串格式化。这会允许NLog推迟格式化和减少格式化的开销。

因此推荐像下面一样使用Logging:

logger.Info("Hello {0}", "Earth");

3. Logger应该将异常当参数传入

避免将异常当格式化参数传入,而是将异常当第一个参数显示传入。这将帮助NLog 目标提供更完整和更好的日志内容.

推荐
try { } catch (Exception ex) { logger.Error(ex, "Something bad happened"); }

避免
try
{
}
catch (Exception ex)
{
    logger.Error("Something bad happened, error message:{0}",ex); 
}
 

4. 验证 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

5. 记得刷新输出到文件

NLog默认会在程序关闭的时候自动刷新到文件。微软Windows系统给.Net程序一小点时间来在程序被完全终止前处理关闭(通常是2s)。如果一个NLog配置的NLog目标需要使用网络通信(Http, Mail, Tcp), 那么在Linux/Windows上手动执行一个刷新/关闭操作是一个更好的选择。

NLog.LogManager.Shutdown(); // 刷新并关闭内部的线程和计时器

在Mono/Linux上运行的.Net程序要求在进入关闭阶段之前关闭所有线程和计时器。如果没有完成这个,那么会导致未处理的异常和段错误,和其他不可预知的行为。

6. 异步写日志

如果要启用异步写日志,只需要配置添加 async="true"

<targets async="true">

参考资料:NLOG Tutorial

posted @ 2018-12-06 14:34  Harry Jiang  阅读(885)  评论(0编辑  收藏  举报