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

推荐阅读更多精彩内容

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