• 使用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

  • 相关阅读:
    SonarQube 插件之 Issues Report & SonarLint 的配置及使用
    Docker搭建自己的Gitlab CI Runner
    Nexus OSS 3 搭建并配置使用 Docker & Git LFS 仓库
    js字符串去掉回车和空格
    使用QtCreator来进行UML建模
    Qt字符串转二维码字符串
    C++10进制转16进制字符串互转
    Qt设置控件透明度
    Qt在槽函数里判断是哪个对象触发的信号
    Qt求极值
  • 原文地址:https://www.cnblogs.com/Martianhh/p/10076571.html
Copyright © 2020-2023  润新知