官方网址: https://nlog-project.org/ 参考文章: https://blog.csdn.net/xishining/article/details/85219755

简介:

NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码。
NLog是一个简单灵活的.NET日志记录类库。通过使用NLog,我们可以在任何一种.NET语言中输出带有上下文的(contextual information)调试诊断信息,根据喜好配置其表现样式之后发送到一个或多个输出目标(target)中。
NLog的API非常类似于log4net,且配置方式非常简单。NLog使用路由表(routing table)进行配置,这样就让NLog的配置文件非常容易阅读,并便于今后维护。
NLog遵从BSD license,即允许商业应用且完全开放源代码。任何人都可以免费使用并对其进行测试,然后通过邮件列表反馈问题以及建议。
NLog支持.NET、C/C++以及COM interop API,因此我们的程序、组件、包括用C++/COM 编写的遗留模块都可以通过同一个路由引擎将信息发送至NLog中。
简单来说Nlog就是用来记录项目日志的组件

NLog日志输出目标

  • 文件 比如TXT、Excel
  • 文本控制台
  • Email
  • 数据库
  • 网络中的其它计算机(通过TCP或UDP)
  • 基于MSMQ的消息队列
  • Windows系统日志

image.png

NLog使用

01.直接使用NUGET安装

image.png
image.png
image.png
:::tips 注意在NLog.config的属性中设置 Copy to Output Directory: Copy always :::

简单的Demo

NLog的配置

  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. xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  5. autoReload="true"
  6. throwExceptions="false"
  7. internalLogLevel="Off" internalLogFile="./logs/nlog-internal.log">
  8. <!-- optional, add some variables
  9. https://github.com/nlog/NLog/wiki/Configuration-file#variables
  10. -->
  11. <variable name="Version" value="2019.01.01"/>
  12. <variable name="Program" value="Program"/>
  13. <variable name="Flag" value="0"/>
  14. <!--
  15. See https://github.com/nlog/nlog/wiki/Configuration-file
  16. for information on customizing logging rules and outputs.
  17. -->
  18. <targets>
  19. <!--
  20. add your targets here
  21. See https://github.com/nlog/NLog/wiki/Targets for possible targets.
  22. See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
  23. -->
  24. <!-- write logs to file -->
  25. <target name="file" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
  26. <target xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace}" />
  27. </target>
  28. <!-- write log message to database -->
  29. <target name="db" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard">
  30. <target type="Database" dbProvider="sqlserver" connectionString="Data Source=CSHC5197;Initial Catalog=FSTest;Persist Security Info=True;User ID=sa;Password=Atser123;">
  31. <commandText>
  32. INSERT INTO [dbo].[Log]([Timestamp],[Level],[Message],[Program],[Function],[Version],[Flag]) VALUES(@time_stamp, @level, @message, @program, @function,@version,@flag);
  33. <!--INSERT INTO Log(Timestamp,Level,Message,Program,Function,Version,Flag) VALUES(@time_stamp, @level, @message, @program, @function,@version,@flag);-->
  34. <!--INSERT INTO Log(Timestamp,Level,Message,Action) VALUES(@time_stamp, @level, @message, @action);-->
  35. </commandText>
  36. <!-- database connection parameters -->
  37. <parameter name="@time_stamp" layout="${date}" />
  38. <parameter name="@level" layout="${level:uppercase=true}" />
  39. <parameter name="@message" layout="${message}" />
  40. <parameter name="@program" layout="${Program}" />
  41. <parameter name="@function" layout="${stacktrace}" />
  42. <parameter name="@version" layout="${Version}" />
  43. <parameter name="@flag" layout="${Flag}" />
  44. <!--<parameter name="@action" layout="${event-context:item=Action}" />-->
  45. <!--<parameter name="@amount" layout="${event-context:item=Amount}" />-->
  46. </target>
  47. </target>
  48. <!--write log message to Visual Studio Output-->
  49. <target name="debugger" xsi:type="Debugger" layout="NLog: ${date:format=HH\:mm\:ss} | ${level:uppercase=true:padding=-5} | ${message}" />
  50. <!--
  51. Write events to a file with the date in the filename.
  52. <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" />
  53. -->
  54. </targets>
  55. <rules>
  56. <!-- add your logging rules here -->
  57. <!--TRACE,DEBUG,INFO,WARN,ERROR,FATAL-->
  58. <logger name="*" minlevel="Trace" writeTo="debugger" />
  59. <!--INFO,WARN,ERROR,FATAL-->
  60. <!--<logger name="*" minlevel="Info" writeTo="db" />-->
  61. <logger name="*" minlevel="Debug" writeTo="db" />
  62. <!--DEBUG,INFO,WARN,ERROR,FATAL-->
  63. <!--<logger name="demo" minlevel="Debug" writeTo="file" />-->
  64. <logger name="*" minlevel="Debug" writeTo="file" />
  65. <!--
  66. Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace) to "f" <logger name="*" minlevel="Debug" writeTo="f" />
  67. -->
  68. </rules>
  69. </nlog>
  1. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  4. autoReload="true"
  5. throwExceptions="false"
  6. internalLogLevel="Info"
  7. internalLogFile="./logs/nlog-internal.log">

NLog 根节点以下几种配置需要注意

  • autoReload:配置修改是否自动加载。
  • throwExceptions:日志出现异常时是否需要抛出异常,若配置为true日志记录异常时由于没有捕获异常,会导致程序挂掉。
  • internalLogLevel:表示nlog日志的执行日志记录等级。
  • internalLogFile:表示nlog日志的执行日志记录的位置。通过./XXXX的方式可以配置到程序的相对目录。

    Targets

    通过将async设置为true可以异步保存日志,从而防止日志影响业务性能。
    ####xsi:type
    输入类型,支持以下类型。
    ColoredConsole : 使用可自定义的颜色将日志消息写入控制台。
    Console - 将日志消息写入控制台。
    Debug - 模拟目标-用于测试。
    File - 将日志消息写入一个或多个文件。
    Mail - 使用 smtp 协议或拾取文件夹通过电子邮件发送日志邮件。
    Null - 丢弃日志消息。主要用于调试和基准测试

NLog通过target配置日志输入的目标。可以通过配置多个target将日志输入到多个目录,多个目标(文件,网络,数据库等)。

通过将async设置为true可以异步保存日志,从而防止日志影响业务性能。

  1. xsi:type:输入类型,支持以下类型。
  • ColoredConsole : 使用可自定义的颜色将日志消息写入控制台。
  • Console - 将日志消息写入控制台。
  • Debug - 模拟目标-用于测试。
  • File - 将日志消息写入一个或多个文件。
  • Mail - 使用 smtp 协议或拾取文件夹通过电子邮件发送日志邮件。
  • Null - 丢弃日志消息。主要用于调试和基准测试。

name:目标的名字,可以通过创建Rule规则限制目标的输出。
fileName:文件名,日志保存文件时可以保存到该文件中。文件名支持参数化,通过各种参数更方便的输出日志。
layout:表示输出的格式,若为最简单的内容输入,则直接通过参数设置输入格式即可。除了最简单的文本格式还支持以下四种类型的数据,通过xsi:type参数设置layout的格式,如xsi:type="JsonLayout"

  • CSV - A specialized layout that renders CSV-formatted events.
  • Compound - A layout containing one or more nested layouts.
  • JSON - A specialized layout that renders to JSON.
  • Log4JXml - A specialized layout that renders Log4j-compatible XML events.

下面列举两项常用的输入方式,文件输出和网络输出。

具体参数说明

  1. <targets async= Boolean> //是否异步
  2. <target
  3. xsi:type="File" //输出类型
  4. name="String" //节点名称
  5. layout="Layout" //日志输入格式
  6. header="Layout" //日志头显示的文本内容
  7. footer="Layout" //日志尾显示的文本内容
  8. encoding="Encoding" //文件编码格式
  9. lineEnding="Enum" //行结束模式
  10. archiveAboveSize="Long" //存档上限值
  11. maxArchiveFiles="Integer" //保存的最大存档文件数,默认9
  12. archiveFileName="Layout" //存档文件名称。允许使用Layout
  13. archiveNumbering="Enum" //存档文件的编号方式
  14. archiveEvery="Enum" //是否在每个设定时间刻自动存档日志文件
  15. replaceFileContentsOnEachWrite="Boolean" //是否覆盖每次写入的日志内容,默认false
  16. fileAttributes="Enum" //文件属性(只支持Windows
  17. fileName="Layout" //写入日志的文件名称 支持Layout
  18. deleteOldFileOnStartup="Boolean" //启动时,是否删除旧的日志文件 。默认为false
  19. enableFileDelete="Boolean" //否允许删除日志文件。默认为true
  20. createDirs="Boolean" //是否允许自动创建(不存在的)目录。默认为true
  21. concurrentWrites="Boolean" //是否允许使用通过多个进程的方式,将日志信息并行写入文件中。,默认为true
  22. openFileCacheTimeout="Integer" //文件保持打开状态的最大时间秒数
  23. openFileCacheSize="Integer" //保持打开状态的文件数量
  24. networkWrites="Boolean" //是否通过多线程由不同的网络主机并行向文件中写入日志默认false
  25. concurrentWriteAttemptDelay="Integer"
  26. concurrentWriteAttempts="Integer"
  27. bufferSize="Integer" //日志文件缓存区大小(字节) 默认值为32768(32KB
  28. autoFlush="Boolean" //在每次日志信息后,是否自动刷新文件缓存区 默认true
  29. keepFileOpen="Boolean" //是否保持日志文件处于打开状态,以代替其在每次日志写事件发生时频繁打开和关闭默认值为false
  30. 备注:设置此属性为true,有助于提高性能。
  31. />
  32. </targets>

配置参数说明:

xmlns=“http://www.nlog-project.org/schemas/NLog.xsd” 这表示默认命名空间
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“ 这个命名空间里面的元素或者属性就必须要以xsi:这种方式来写
比如schemaLocation就是他的一个属性,所以写成xsi:schemaLocation
而默认命名空间不带类似xsi这种,其实xml标签名称有个专业叫法叫做QName,而如果没有前面的xsi:这种一般叫做NCName
xsi:schemaLocation=”http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd”
表示把定义这个命名空间的schema文件给引用进来,好让开发类型工具能够解析和验证你的xml文件是否符合语法规范等同于简单来说 上面是用来验证你XML格式是否正确的。
InternalLogFile=”c:\log\nlog.txt” //NLog内部日志文件位置
internalLogLevel=”Debug” //日志级别
autoReload:一旦启动程序,这时候NLog.config文件被读取后,知道程序再启动都不会再读取配置文件了。假如我们不想停掉程序,比如说服务器哪能说停就停哈。这就用上这个配置了,这个配置功能是,一旦你对配置文件修改,程序将会重新读取配置文件,也就是自动再配置。
throwExceptions//NLog日志系统抛出异常
internalLogFile=”c:\log\nlog.txt” //NLog内部日志文件位置
internalLogLevel=”Debug” //日志级别
<variable /> -定义配置文件中用到的变量
<targets /> - 定义日志的目标/输出
<rules /> - 定义日志的路由规则

Layout布局

几种常见的
${var:basePath} basePath是前面自定义的变量
${longdate} 日期格式 2017-01-17 16:58:03.8667
${shortdate}日期格式 2017-01-17
${date:yyyyMMddHHmmssFFF} 日期 20170117165803866
${message} 输出内容
${guid} guid
${level}日志记录的等级
${logger} 配置的logger

NLog记录等级

Trace - 最常见的记录信息,一般用于普通输出
Debug - 同样是记录信息,不过出现的频率要比Trace少一些,一般用来调试程序
Info - 信息类型的消息
Warn - 警告信息,一般用于比较重要的场合
Error - 错误信息
Fatal - 致命异常信息。一般来讲,发生致命异常之后程序将无法继续执行。
自上而下,等级递增。
Nlog支持以下几种日志等级

Level FirstCharacter Ordinal
Trace T 0
Debug D 1
Info I 2
Warn W 3
Error E 4
Fatal F 5
Off O 6

在日志输入时可以通过${level}输入日志等级,或者通过${level:format=FirstCharacter}输出日志等级的简写。
若想查看所有参数输出可以到这里查看。

NLog等级使用

指定特定等级 如:level=”Warn”
指定多个等级 如:levels=“Warn,Debug“ 以逗号隔开
指定等级范围 如:minlevel=”Warn” maxlevel=”Error”

在代码中我们不支持Off等级的输出。通过NLog不需要我们认为对日志模块进行启动或关闭,在我们程序关闭后,它会自动关闭日志。相关的Nlog的日志可以在internalLogFile配置的路径中中查看到,同时在生产环境建议将internalLogLevelNLog自己的日志等级设置为Info,这样只会记录关键的日志信息。

Logger使用

从配置文件读取信息并初始化 两种常用的方式
根据配置的路由名获生成特定的logger Logger logger = LogManager.GetLogger(“LoggerDemo”);
初始化为当前命名空间下当前类的logger Logger logger = LogManager.GetCurrentClassLogger();
区别是logger的name不一样 前者是LoggerDemo,后者是当前命名空间+点+当前类名 如类比较多,并且往同一个日志文件记录,建议用GetCurrentClassLogger

Logger有以下三种常用的写入方式
logger.Error(“这是DatabaseDemo的错误信息”);
logger.Error(“ContentDemo {0}:{1}”,“时间”,DateTime.Now.ToString());需要拼接字符串的话推荐这种,NLog做了延迟处理,用的时候才拼接。
logger.Log(LogLevel.Error, “这是ContentDemo”);

Logger发邮件参数

smtpServer=“*” 邮件服务器 例如126邮箱是smtp.126.com
smtpPort=“25“端口
smtpAuthentication=“Basic“ 身份验证方式 基本
smtpUserName=“*“ 邮件服务器用户名
smtpPassword=“**”邮件服务器密码
enableSsl=“false”是否使用安全连接 需要服务器支持
addNewLines=“true” 开头与结尾是否换行
from=“**” 发件邮箱
to=“XXXX@XX.com,XXXXX@XX.com”收件邮箱 多个以逗号分隔
subject=“subject:${machinename}报错“ 邮件主题
header=“——————————-开头————————————-“ 邮件开头
body=“${newline}${message}${newline}“ 邮件内容
footer=“——————————-结尾————————————-“ 邮件结尾

  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. xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  5. autoReload="true"
  6. throwExceptions="true"
  7. internalLogLevel="Off"
  8. internalLogFile="c:\temp\nlog-internal.log">
  9. <!-- optional, add some variables
  10. https://github.com/nlog/NLog/wiki/Configuration-file#variables
  11. -->
  12. <variable name="basePath" value="C:\Users\Zachary\Desktop\练习\20170113NLog\Logs\"/>
  13. <targets>
  14. <target xsi:type="Mail"
  15. name="SendMail"
  16. smtpServer="你的邮件服务器"
  17. smtpPort="你的邮件服务器端口"
  18. smtpAuthentication="Basic"
  19. smtpUserName="你的邮件服务器名"
  20. smtpPassword="你的邮件服务器密码"
  21. enableSsl="false"
  22. addNewLines="false"
  23. from="你的发件邮箱"
  24. to="你的收件邮箱"
  25. subject="subject:${machinename}报错"
  26. header="---------------------开头-------------------------"
  27. body="${newline}${message}${newline}"
  28. footer="---------------------结尾-------------------------"
  29. encoding="UTF-8"/>
  30. </targets>
  31. <rules>
  32. <logger name="*" level="Error" writeTo="SendMail"></logger>
  33. </rules>
  34. </nlog>

Logger写入数据库参数

name=”DatabaseFile”
dbProvider=“System.Data.SqlClient”数据库类型
commandText=“Insert into ErrorLog(ID, Content, CreateTime) Values(@id, @content, @createTime);”插入操作
connectionString=“data source=.;initial catalog=NLog;user id=sa;password=**;”> 数据库连接字符串 跟我们webcofig中的一样
参数



需在数据库里提前建好表

  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. xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  5. autoReload="true"
  6. throwExceptions="true"
  7. internalLogLevel="Off"
  8. internalLogFile="../../../Logs/nlog-internal.log">
  9. <targets>
  10. <target xsi:type="Database"
  11. name="DatabaseFile"
  12. dbProvider="System.Data.SqlClient"
  13. commandText="Insert into ErrorLog(ID, Content, CreateTime) Values(@id, @content, @createTime);"
  14. connectionString="data source=.;initial catalog=NLog;user id=sa;password=你的数据库密码;">
  15. <parameter name="@id" layout="${guid}" />
  16. <parameter name="@content" layout="${message}" />
  17. <parameter name="@createTime" layout="${date:format=yyyy\-MM\-dd HH\:mm\:ss.fff} " />
  18. </target>
  19. </targets>
  20. <rules>
  21. <logger name="Database" level="Error" writeTo="DatabaseFile"/>
  22. </rules>
  23. </nlog>

NLog.config可以单独放,也可以放在WebConfig里。
在configuration配置


  1. <configuration>
  2. <configSections>
  3. <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
  4. </configSections>
  5. <nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
  8. autoReload="true"
  9. throwExceptions="true"
  10. internalLogLevel="Off"
  11. internalLogFile="c:\temp\nlog-internal.log">
  12. <variable name="myvar" value="myvalue"/>
  13. <targets async="false">
  14. <target xsi:type="File" name="WebDemoFile" fileName="C:\Users\Zachary\Desktop\练习\20170113NLog\Logs\${date:yyyyMMddHHmm}WebDemo.txt" layout="${longdate} ${message}" encoding="UTF-8"/>
  15. </targets>
  16. <rules>
  17. <logger name="WebDemo" level="Error" writeTo="WebDemoFile"/>
  18. </rules>
  19. </nlog>
  20. </configuration>

Rules规则

<rules> <logger name="*" minlevel="Debug" writeTo="f" /> </rules>
在Nlog节点下添加rules节点,rules节点下可以配置多个logger节点,每个logger节点即为一条约束。

name:**l*ogger名称,若为则表示适用于所有日志,
若我们某个target专门用于logdemo.test类的日志输出,则那么可以设置为logdemo.test.*,
表示当前约束只允许命名空间为logdemo.test开头的日志输出。
minlevel:表示当前约束的最小等级,只有等于或大于该值的日志等级才会被记录。
writeTo:表示当前规则约束哪个target。

调用

  1. public static util.Logger logger=new util.Logger("configFileName");
  2. //然后调用`logger`的Debug、Error....即可

筛选

  1. <rules>
  2. <logger name="*" writeTo="file">
  3. <filters>
  4. <when condition="length('${message}') > 100" action="Ignore" />
  5. <when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" />
  6. <when condition="(level >= LogLevel.Debug and contains('${message}','PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" />
  7. <when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" />
  8. </filters>
  9. </logger>
  10. </rules