官方网址: 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
- 文本控制台
- 数据库
- 网络中的其它计算机(通过TCP或UDP)
- 基于MSMQ的消息队列
- Windows系统日志
NLog使用
01.直接使用NUGET安装



:::tips
注意在NLog.config的属性中设置 Copy to Output Directory: Copy always
:::
简单的Demo
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"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="false"internalLogLevel="Off" internalLogFile="./logs/nlog-internal.log"><!-- optional, add some variableshttps://github.com/nlog/NLog/wiki/Configuration-file#variables--><variable name="Version" value="2019.01.01"/><variable name="Program" value="Program"/><variable name="Flag" value="0"/><!--See https://github.com/nlog/nlog/wiki/Configuration-filefor information on customizing logging rules and outputs.--><targets><!--add your targets hereSee https://github.com/nlog/NLog/wiki/Targets for possible targets.See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.--><!-- write logs to file --><target name="file" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard"><target xsi:type="File" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${level:uppercase=true} ${event-context:item=Action} ${message} ${event-context:item=Amount} ${stacktrace}" /></target><!-- write log message to database --><target name="db" xsi:type="AsyncWrapper" queueLimit="5000" overflowAction="Discard"><target type="Database" dbProvider="sqlserver" connectionString="Data Source=CSHC5197;Initial Catalog=FSTest;Persist Security Info=True;User ID=sa;Password=Atser123;"><commandText>INSERT INTO [dbo].[Log]([Timestamp],[Level],[Message],[Program],[Function],[Version],[Flag]) VALUES(@time_stamp, @level, @message, @program, @function,@version,@flag);<!--INSERT INTO Log(Timestamp,Level,Message,Program,Function,Version,Flag) VALUES(@time_stamp, @level, @message, @program, @function,@version,@flag);--><!--INSERT INTO Log(Timestamp,Level,Message,Action) VALUES(@time_stamp, @level, @message, @action);--></commandText><!-- database connection parameters --><parameter name="@time_stamp" layout="${date}" /><parameter name="@level" layout="${level:uppercase=true}" /><parameter name="@message" layout="${message}" /><parameter name="@program" layout="${Program}" /><parameter name="@function" layout="${stacktrace}" /><parameter name="@version" layout="${Version}" /><parameter name="@flag" layout="${Flag}" /><!--<parameter name="@action" layout="${event-context:item=Action}" />--><!--<parameter name="@amount" layout="${event-context:item=Amount}" />--></target></target><!--write log message to Visual Studio Output--><target name="debugger" xsi:type="Debugger" layout="NLog: ${date:format=HH\:mm\:ss} | ${level:uppercase=true:padding=-5} | ${message}" /><!--Write events to a file with the date in the filename.<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log" layout="${longdate} ${uppercase:${level}} ${message}" />--></targets><rules><!-- add your logging rules here --><!--TRACE,DEBUG,INFO,WARN,ERROR,FATAL--><logger name="*" minlevel="Trace" writeTo="debugger" /><!--INFO,WARN,ERROR,FATAL--><!--<logger name="*" minlevel="Info" writeTo="db" />--><logger name="*" minlevel="Debug" writeTo="db" /><!--DEBUG,INFO,WARN,ERROR,FATAL--><!--<logger name="demo" minlevel="Debug" writeTo="file" />--><logger name="*" minlevel="Debug" writeTo="file" /><!--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" />--></rules></nlog>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="false"internalLogLevel="Info"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可以异步保存日志,从而防止日志影响业务性能。
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.
具体参数说明
<targets async=” Boolean”> //是否异步<targetxsi:type="File" //输出类型name="String" //节点名称layout="Layout" //日志输入格式header="Layout" //日志头显示的文本内容footer="Layout" //日志尾显示的文本内容encoding="Encoding" //文件编码格式lineEnding="Enum" //行结束模式archiveAboveSize="Long" //存档上限值maxArchiveFiles="Integer" //保存的最大存档文件数,默认9archiveFileName="Layout" //存档文件名称。允许使用LayoutarchiveNumbering="Enum" //存档文件的编号方式archiveEvery="Enum" //是否在每个设定时间刻自动存档日志文件replaceFileContentsOnEachWrite="Boolean" //是否覆盖每次写入的日志内容,默认falsefileAttributes="Enum" //文件属性(只支持Windows)fileName="Layout" //写入日志的文件名称 支持LayoutdeleteOldFileOnStartup="Boolean" //启动时,是否删除旧的日志文件 。默认为falseenableFileDelete="Boolean" //否允许删除日志文件。默认为truecreateDirs="Boolean" //是否允许自动创建(不存在的)目录。默认为true。concurrentWrites="Boolean" //是否允许使用通过多个进程的方式,将日志信息并行写入文件中。,默认为trueopenFileCacheTimeout="Integer" //文件保持打开状态的最大时间秒数openFileCacheSize="Integer" //保持打开状态的文件数量networkWrites="Boolean" //是否通过多线程由不同的网络主机并行向文件中写入日志默认falseconcurrentWriteAttemptDelay="Integer"concurrentWriteAttempts="Integer"bufferSize="Integer" //日志文件缓存区大小(字节) 默认值为32768(32KB)autoFlush="Boolean" //在每次日志信息后,是否自动刷新文件缓存区 默认truekeepFileOpen="Boolean" //是否保持日志文件处于打开状态,以代替其在每次日志写事件发生时频繁打开和关闭默认值为false。备注:设置此属性为true,有助于提高性能。/></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=“——————————-结尾————————————-“ 邮件结尾
<?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"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="true"internalLogLevel="Off"internalLogFile="c:\temp\nlog-internal.log"><!-- optional, add some variableshttps://github.com/nlog/NLog/wiki/Configuration-file#variables--><variable name="basePath" value="C:\Users\Zachary\Desktop\练习\20170113NLog\Logs\"/><targets><target xsi:type="Mail"name="SendMail"smtpServer="你的邮件服务器"smtpPort="你的邮件服务器端口"smtpAuthentication="Basic"smtpUserName="你的邮件服务器名"smtpPassword="你的邮件服务器密码"enableSsl="false"addNewLines="false"from="你的发件邮箱"to="你的收件邮箱"subject="subject:${machinename}报错"header="---------------------开头-------------------------"body="${newline}${message}${newline}"footer="---------------------结尾-------------------------"encoding="UTF-8"/></targets><rules><logger name="*" level="Error" writeTo="SendMail"></logger></rules></nlog>
Logger写入数据库参数
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中的一样
需在数据库里提前建好表
<?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"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="true"internalLogLevel="Off"internalLogFile="../../../Logs/nlog-internal.log"><targets><target xsi:type="Database"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=你的数据库密码;"><parameter name="@id" layout="${guid}" /><parameter name="@content" layout="${message}" /><parameter name="@createTime" layout="${date:format=yyyy\-MM\-dd HH\:mm\:ss.fff} " /></target></targets><rules><logger name="Database" level="Error" writeTo="DatabaseFile"/></rules></nlog>
NLog.config可以单独放,也可以放在WebConfig里。
在configuration配置
<configuration><configSections><section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/></configSections><nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"autoReload="true"throwExceptions="true"internalLogLevel="Off"internalLogFile="c:\temp\nlog-internal.log"><variable name="myvar" value="myvalue"/><targets async="false"><target xsi:type="File" name="WebDemoFile" fileName="C:\Users\Zachary\Desktop\练习\20170113NLog\Logs\${date:yyyyMMddHHmm}WebDemo.txt" layout="${longdate} ${message}" encoding="UTF-8"/></targets><rules><logger name="WebDemo" level="Error" writeTo="WebDemoFile"/></rules></nlog></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。
调用
public static util.Logger logger=new util.Logger("configFileName");//然后调用`logger`的Debug、Error....即可
筛选
<rules><logger name="*" writeTo="file"><filters><when condition="length('${message}') > 100" action="Ignore" /><when condition="equals('${logger}','MyApps.SomeClass')" action="Ignore" /><when condition="(level >= LogLevel.Debug and contains('${message}','PleaseDontLogThis')) or level==LogLevel.Warn" action="Ignore" /><when condition="not starts-with('${message}','PleaseLogThis')" action="Ignore" /></filters></logger></rules
