优势

上手简单,文档比 log4net 更友好,快速解决了 DLL log 的问题

简介

Flexible & free open-source logging for .NET

资源:

  • github
  • NLog 项目官网
  • 官方教程
  • 使用 NLog 的最佳实践

    使用技巧

    写入至多个位置

    参考官方教程同时写入 file.txt 和控制台:

    1. <?xml version="1.0" encoding="utf-8" ?>
    2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    4. <targets>
    5. <target name="logfile" xsi:type="File" fileName="file.txt" />
    6. <target name="logconsole" xsi:type="Console" />
    7. </targets>
    8. <rules>
    9. <logger name="*" minlevel="Info" writeTo="logconsole" />
    10. <logger name="*" minlevel="Debug" writeTo="logfile" />
    11. </rules>
    12. </nlog>

    滚动写入 Archive

    NLog 没有明显和滚动写入相关的配置,这是因为它通过更强大的 Archive(归档) 实现了滚动写入及更多功能。

4.5 及以上版本有个很好的官方示例 Archive old log files

它实现以下几个功能:

  1. 每天首次写入日志时新建一个 log 文件
  2. 若当天的 log 文件大于 10240B 就分隔 log 文件
  3. 保留之前 3 天的所有 log 文件,更老的就自动删掉

    1. <?xml version="1.0" ?>
    2. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    4. <targets>
    5. <target name="file" xsi:type="File"
    6. layout="${longdate} ${logger} ${message}${exception:format=ToString}"
    7. fileName="${basedir}/logs/logfile.txt"
    8. maxArchiveFiles="4"
    9. archiveAboveSize="10240"
    10. archiveEvery="Day" />
    11. </targets>
    12. <rules>
    13. <logger name="*" minlevel="Debug" writeTo="file" />
    14. </rules>
    15. </nlog>

自动创建的 log 文件名如下:

  1. * logfile.txt
  2. * logfile.3.txt
  3. * logfile.2.txt
  4. * logfile.1.txt

4.5 以下的老版本可以参考 FileTarget Archive Examples 中的诸多例子实现滚动写入。

同一解决方案的多个项目使用一套 NLog 配置

  1. 在启动项目安装 NLog
  2. 在启动项目中配置 NLog.config
  3. 在其他项目安装 NLog
  4. 删除其他项目中的 NLog.config 和 NLog.xsd 文件

效果:
image.png

通过 RictTextBox 输出 Log 信息

WinForm

先安装 NLog 和 NLog.Windows.Forms,再参考 配置说明 配置 NLog.config。

两种输出方式:

  1. NLog 自动创建一个包含 RichTextBox 的 Form(默认)
  2. 输出到已有 Form 的 RichTextBox

要想输出到已有 Form,有三个关键点:

  1. 保证 NLog config 中的 formName=”FormMain” controlName=”rtbLog” 和实际用的一致
  2. NLog config 中设置 allowAccessoryFormCreation="False"
  3. 在 Form 初始化控件完毕后插入这句代码 RichTextBoxTarget.ReInitializeAllTextboxes(this);

设置输出样式,可以参考 SOF

示例:将 Trace 级别的日志输出到窗体名为 FormMain 中的一个名为 RtbLog 的 RichTextBox 中。

  1. <targets async="true">
  2. <target xsi:type="RichTextBox" name="LogRtb"
  3. layout="${time} ${message}" maxLines="500"
  4. height="200" width="600" autoScroll="True" supportLinks="False" toolWindow="True"
  5. formName="FormMain" controlName="rtbLog" allowAccessoryFormCreation="False" >
  6. <row-coloring condition="level == LogLevel.Trace" fontColor="Gray" backgroundColor="Control" />
  7. <row-coloring condition="level == LogLevel.Info" fontColor="ControlText" backgroundColor="Control" />
  8. </target>
  9. </targets>
  10. <rules>
  11. <!-- LogRtb just log trace and info -->
  12. <logger name="*" level="Trace" writeTo="LogRtb"/>
  13. </rules>

注:设置 row-coloring 是为了分辨输出的日志级别。

WPF

参考前人做好的轮子:https://github.com/erizet/NlogViewer