Nlog笔记

发布时间 2023-10-26 10:22:41作者: 时而有风

NLog可以在NuGet中下载.

配置NLog输出的Targets

NLog 可以使用一个 NLog.config 的 XML 配置文件去配置你的应用程序(文件的属性需修改为:始终复制),下面是一个简单 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>
    <!--输出目标:name名称f,xsi:type输出类型文件, fileName输出到程序根目录logs文件夹中-->
        <target name="logfile" xsi:type="File" fileName="file.txt" />
        <target name="logconsole" xsi:type="Console" />
    </targets>
 
    <rules>
      <!--日志路由规则:最低级别Debug,输出到target目标fileName-->
        <logger name="*" minlevel="Info" writeTo="logconsole" />
        <logger name="*" minlevel="Debug" writeTo="logfile" />
    </rules>
</nlog>

 若想要把日志文件按时间存放文件夹,可这么写:

fileName="${basedir}/Logs/${date:format=yyyy}/${date:format=MM}/${date:format=dd}/${event-properties:filename}.log"

 其中target的格式:

<targets>
    <target name="f"
            xsi:type="File"
            fileName="${basedir}/logs/${shortdate}.log"
            layout="${longdate} ${uppercase:${level}} ${message}" 
            maxArchiveFiles="5"
            archiveAboveSize="10240"
            archiveEvery="Day"/>
</targets>

Nlog允许用户配置单个文件大小, 放置在内容过长效率过慢,配置了大小之后, Nlog会自动创建一个新的文件副本,插入新的日志输出。

maxArchiveFiles:允许生成的副本文件最大数量

archiveAboveSize:允许单个文件得最大容量

archiveEvery:按天生成

name:输出目标的名称,用于rules中路由规则writeTo指定

fileName:包含完整的生成文件的路径和文件名

xsi:type:输出类型如下:

Chainsaw
ColoredConsole 
Console
Database
Debug
Debugger
EventLog
File
LogReceiverService
Mail
Memory
MethodCall
Network
NLogViewer
Null
OutputDebugString
PerfCounter
Trace
WebService

layout:用来规定输出内容格式,语法“${属性}”,可以把上下文信息插入到日志中。

        上文target代码中layout解析:

layout="${longdate} ${uppercase:${level}} ${message}" 

${longdate}:日期和时间,采用可排序的长格式`yyyy-MM-dd HH:mm:ss.ffff`。

${uppercase:${level}}:uppercase将另一个布局输出的结果转换为大写;level日志级别(例如ERROR,DEBUG)或级别序数(数字)。

${message}:(格式化的)日志消息。

$ {cached} -  将缓存应用于另一个布局输出。
$ {db-null} - 为数据库渲染DbNull
$ {exception} - 通过调用Logger方法之一提供的异常信息
$ {level} - 日志级别(例如ERROR,DEBUG)或级别序数(数字)
$ {literal} - 字符串文字。(文本)-有用,以逃避括号
$ {logger} - 记录器名称。GetLogger,GetCurrentClassLogger等
$ {message} - (格式化的)日志消息。
$ {newline} - 换行文字。
$ {object-path} -  渲染对象的(嵌套)属性
$ {onexception} -  仅在为日志消息定义了异常时才输出内部布局。
$ {var} - 渲染变量
呼叫站点和堆栈跟踪-------------------------------------------------------------
$ {callsite} - 调用站点(类名,方法名和源信息)
$ {callsite-linenumber} - 呼叫站点源行号。
$ {stacktrace} - 渲染堆栈跟踪
条件------------------------------------------------------------------------
$ {when} -  仅在满足指定条件时输出内部布局。
$ {whenempty} -  当内部布局产生空结果时,输出替代布局。
上下文信息-------------------------------------------------------------------
$ {activityid} - 将System.Diagnostics跟踪关联ID记录到日志中。
$ {all-event-properties} - 记录所有事件上下文数据。
$ {event-context} -  记录事件属性数据-替换为$ {event-properties}
$ {event-properties} - 记录事件属性数据-重命名$ {event-context}
$ {gdc} - 全局诊断上下文项。包含每个应用程序实例值的字典结构。
$ {install-context} - 安装参数(传递给InstallNLogConfig)。
$ {mdc} - 映射诊断上下文-线程局部结构。
$ {mdlc} - 异步映射诊断上下文-线程局部结构。MDC的异步版本
$ {ndc} - 嵌套诊断上下文-线程局部结构。
$ {ndlc} - 异步嵌套诊断上下文-线程本地结构。
专柜-----------------------------------------------------------------------
$ {counter} - 一个计数器值(在每个布局渲染中增加)
$ {guid} - 全局唯一标识符(GUID)。
$ {sequenceid} - 日志序列号
日期和时间------------------------------------------------------------------
$ {date} - 当前日期和时间。
$ {longdate} - 日期和时间,采用可排序的长格式`yyyy-MM-dd HH:mm:ss.ffff`。
$ {qpc} - 高精度计时器,基于QueryPerformanceCounter返回的值。
$ {shortdate} - 短日期,格式为yyyy-MM-dd。
$ {ticks} - 当前日期和时间的“ Ticks”值。
$ {时间} - 在24小时,可排序的格式HH的时间:MM:ss.mmm。
编码和字符串转换--------------------------------------------------------------
$ {json-encode} -  使用JSON规则转义另一个布局的输出。
$ {left} -  文字的左半部分
$ {小写} -  将另一个布局输出的结果转换为小写。
$ {norawvalue} -  防止将另一个布局渲染器的输出视为原始值
$ {pad} -  将填充应用于另一个布局输出。
$ {replace} -  将另一个布局的输出中的字符串替换为另一个字符串。正则表达式可选
$ {replace-newlines} -  用另一个字符串替换换行符。
$ {right} -  文字的右侧
$ {rot13} -  使用ROT-13解码“加密”的文本。
$ {substring} -  文本的子字符串
$ {trim-whitespace} -  从另一个布局渲染器的结果修剪空白。
$ {uppercase} -  将另一个布局输出的结果转换为大写。
$ {url-encode} -  编码另一个布局输出的结果,以供URL使用。
$ {wrapline} -  以指定的行长包装另一个布局输出的结果。
$ {xml-encode} -  将另一个布局输出的结果转换为XML兼容的。
环境和配置文件----------------------------------------------------------------
$ {appsetting} -. config文件 NLog.Extended中的应用程序配置设置
$ {configsetting} - 来自appsettings.json或ASP.NET Core和.NET Core中其他配置的值 NLog.Extensions.Logging NLog.Extensions.Hosting NLog.Web.AspNetCore
$ {environment} - 环境变量。(例如PATH,OSVersion)
$ {environment-user} - 用户身份信息(用户名)。
$ {}注册表 - 从Windows注册表中的值。
文件和目录--------------------------------------------------------------------
$ {basedir} - 当前应用程序域的基本目录。
$ {currentdir} - 应用程序的当前工作目录。
$ {file-contents} - 呈现指定文件的内容。
$ {filesystem-normalize} -  通过将文件名替换为安全字符来过滤文件名中不允许的字符。
$ {} nlogdir - 其中NLog.dll所在的目录。
$ {specialfolder} - 系统专用文件夹路径(包括“我的文档”,“我的音乐”,“程序文件”,“桌面”等)。
$ {tempdir} - 临时目录。
身分识别----------------------------------------------------------------------
$ {identity} - 线程身份信息(名称和身份验证信息)。
$ {windows-identity} - 线程Windows身份信息(用户名)
$ {windows-identity} - 线程Windows身份信息(用户名) Nlog.WindowsIdentity
整合方式----------------------------------------------------------------------
$ {gelf} - 将日志转换为GELF格式 NLog.GelfLayout 外部
$ {log4jxmlevent} - 与log4j,Chainsaw和NLogViewer兼容的XML事件描述。
进程,线程和程序集--------------------------------------------------------------
$ {appdomain} - 当前的应用程序域。
$ {assembly-version} - 默认应用程序域中可执行文件的版本。
$ {gc} - 有关垃圾收集器的信息。
$ {hostname} - 运行该进程的计算机的主机名。
$ {local-ip} - 来自网络接口的本地IP地址。
$ {machinename} - 运行进程的计算机名。
$ {performancecounter} - 性能计数器。
$ {processid} - 当前进程的标识符。
$ {processinfo} - 有关正在运行的进程的信息。例如StartTime,PagedMemorySize
$ {processname} - 当前进程的名称。
$ {processtime} - 格式为HH:mm:ss.mmm的处理时间。
$ {threadid} - 当前线程的标识符。
$ {threadname} - 当前线程的名称。
Silverlight------------------------------------------------------------------------
$ {document-uri} - 承载当前Silverlight应用程序的HTML页面的URI。
$ {sl-appinfo} - 有关Silverlight应用程序的信息。
Web,ASP.NET和ASP.NET Core----------------------------------------------------------
$ {ASPNET-appbasepath} - ASP.NET应用程序的基本路径(内容根) NLog.Web NLog.Web.AspNetCore
$ {ASPNET应用} - ASP.NET应用程序变量。 网络日志
$ {ASPNET环境} - ASP.NET环境名称 NLog.Web.AspNetCore
$ {ASPNET项} - ASP.NET`HttpContext`项变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-MVC-行动} - ASP.NET MVC动作名称 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-MVC控制器} - ASP.NET MVC控制器名称 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求} - ASP.NET请求变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-请求的contentType} - ASP.NET Content-Type头(实施例应用/ JSON) NLog.Web.AspNetCore
$ {ASPNET请求,饼干} - ASP.NET请求的cookie的内容。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求形式} - ASP.NET请求表的内容。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求报头} - ASP.NET部首键/值对。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求主机} - ASP.NET请求主机。 NLog.Web NLog.Web.AspNetCore
$ {aspnet-request-ip} - 客户端IP。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求-方法} - ASP.NET请求方法(GET,POST等)。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求,贴体} - ASP.NET贴体/净荷 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-请求的查询字符串} - ASP.NET请求的查询字符串。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET,请求引荐} - ASP.NET请求引用。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求的URL} - ASP.NET请求URL。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET请求,用户代理} - ASP.NET请求用户代理。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-响应的StatusCode} - ASP.NET响应状态代码的内容。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET会话} - ASP.NET Session变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-的SessionID} - ASP.NET会话ID的变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET-traceidentifier} - ASP.NET跟踪标识 NLog.Web NLog.Web.AspNetCore
$ {ASPNET用户-的authType} - ASP.NET用户验证。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET用户身份} - ASP.NET用户变量。 NLog.Web NLog.Web.AspNetCore
$ {ASPNET用户-isauthenticated} - ASP.NET用户身份验证? NLog.Web NLog.Web.AspNetCore
$ {ASPNET-webrootpath} - ASP.NET Web根目录路径(wwwroot文件) NLog.Web NLog.Web.AspNetCore
$ {iis-site-name} - IIS网站的名称。 NLog.Web NLog.Web.AspNetCore

 

<rules>
    <logger name="*" minlevel="Debug" writeTo="file" />
</rules>
  • name:记录者的名字。
  • minlevel :最低日志级别。
  • maxlevel:最高日志级别。
  • level:单一日志级别。
  • levels:一系列日志级别,由逗号分隔。
  • final:是否是最后的匹配路由,true表示匹配到这里就结束。
  • writeTo:规则匹配时日志应该被写入的一系列目标,由逗号分隔。就是tagets对应的name。

日志级别有如下,自上而下,等级递增。
- Trace - 最常见的记录信息,一般用于普通输出

- Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序

- Info - 信息类型的消息

- Warn - 警告信息,一般用于比较重要的场合

- Error - 错误信息

- Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行

minlevel="Debug":所有级别等于或者高于Debug的日志信息都写入到“file”这个目标里。同理,maxlevel则为小于;同时有minlevel和maxlevel的则为在这范围内。

写入日志信息

var logger = NLog.LogManager.GetCurrentClassLogger();
logger.Info("我打出了Nlog日志");

结果:

日志最佳实践

  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");

    也可使用单例结构:

     public class LogHelper
        {
            private static Logger logger;
     
            private LogHelper()
            {
                logger = LogManager.GetCurrentClassLogger();
            }
     
            public void WriteLog()
            {
                logger.Info("Write Logs");
            }
     
            #region 单例
     
            private static LogHelper instance;
     
            public static LogHelper Instance()
            {
                if (instance == null)
                {
                    lock (typeof(LogHelper))
                    {
                        if (instance == null)
                        {
                            instance = new LogHelper();
                        }
                    }
                }
     
                return instance;
            }
     
            #endregion
        }
  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>
  5.  Remember to Flush
    当应用停止运行时,NLog 默认会自动尝试刷新. Microsoft Windows 给.Net应用程序在被终止前执行关机(通常是2秒)的时间。如果一个 NLog配置了需要网络传输的 NLog Tagets (Http、Mail、Tcp)运行在Linux/Windows,那么执行一个手动的 Flush/Shutdown 是一个明智之举。
    NLog.LogManager.Shutdown(); // 刷新并关闭内部线程和计时器。

    运行在Mono/Linux 的 .NET 应用在进入应用程序关闭阶段前,必需去停止线程和计时器. 如果未执行完成会导致未处理的异常和分割错误,以及其他不可预知的行为。

  AsyncWrapper 提供一个便捷的快捷设置方式,在配置文件中添加 async="true" 即可:

<?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 async="true">
        <target name="logfile" xsi:type="File" fileName="file.txt" />
    </targets>
 
    <rules>
        <logger name="*" minlevel="Info" writeTo="logfile" />
    </rules>
</nlog>

  这样设置之后,所有写入文件的日志将以异步的方式,可以提高调用线程的响应能力。