NLog简介

安装NLog


asp.net core需要使用另外一个教程

在VS里安装NLog.Config包,这个包会自动安装NLog 包和NLog.Schema包。

NLog.Config包会在vs项目中自动生成一个NLog.config文件。

配置nlog的输出


NLog只会在配置一个(或更多)NLog目标(Target)的情况下产生输出。

NLog可以通过添加一个NLog.config来配置。配置文件到您的应用程序项目(文件属性:总是复制)。这是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>

下面是编程方式进行配置:

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

var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };
var logconsole = new NLog.Targets.ConsoleTarget("logconsole");
            
config.AddRule(LogLevel.Info, LogLevel.Fatal, logconsole);
config.AddRule(LogLevel.Debug, LogLevel.Fatal, logfile);
            
NLog.LogManager.Configuration = config;

写log消息


Example of how to acquire a logger and writing a message to the logger:

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

log等级

每条日志消息都有相关的日志级别,它可以识别消息的重要性/详细信息。NLog可以根据日志记录器的名称和日志级别来路由日志消息。
NLog支持以下日志级别:

  • trace - 非常详细的日志,它可能包括大量的信息,例如协议有效负载。这个日志级别通常只在开发期间启用
  • debug - 调试信息,比跟踪更少,通常在生产环境中不会启用
  • 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");


    // Example of logging an exception
    try
    {

    }
    catch (Exception ex)
    {
        logger.Error(ex, "ow noos!"); // render the exception with ${exception}
        throw;
    }


  }
}

日志输出信息的格式


可以配置如何将一个消息写入NLog目标
如下是大多数NLog目标所使用的默认简单格式:

<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

最佳实践


1. Logger应该是每个类中的静态变量

创建一个新的Logger有开销,因为它必须获得锁和分配对象。因此推荐如下方式创建Logger

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

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

避免预先执行字符串分配或字符串串联,而是让记录器执行格式化。这将允许NLog延迟格式化并减少开销。

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

3. Logger应该放在异常里处理

避免将异常作为格式化参数,而是将其显式地作为第一个参数提供。这将有助于NLog目标提供更好的日志记录。

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

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"的设置,它不应该在生产中使用,因为它会对应用程序造成严重破坏。它用于单元测试和本地故障排除。
参见配置故障排除

5.

NLog在默认情况下会尝试在应用程序关闭时自动刷新。Microsoft Windows.NET应用程序在终止前执行关机(通常是2秒)的时间是有限的。如果有一个NLog以NLog为目标的NLog,需要网络流量(Http、Mail、Tcp),那么在运行linux/windows上独立运行时,这是一个非常好的主意。

NLog.LogManager.Shutdown(); // Flush and close down internal threads and timers
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,993评论 19 139
  • From:Python之日志处理(logging模块) - 云游道士 - 博客园 https://www.cnbl...
    vigny的先生阅读 2,704评论 3 5
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,030评论 0 6
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,084评论 1 13
  • 又到了一年一度的年会高峰期,见证好运的巅峰时刻就要到了,你是否对此也会有所期待? 下班回家的地铁上多了许多手提各类...
    最狸的一只阅读 1,055评论 0 1