官方网址: 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 variables
https://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-file
for information on customizing logging rules and outputs.
-->
<targets>
<!--
add your targets here
See 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”> //是否异步
<target
xsi:type="File" //输出类型
name="String" //节点名称
layout="Layout" //日志输入格式
header="Layout" //日志头显示的文本内容
footer="Layout" //日志尾显示的文本内容
encoding="Encoding" //文件编码格式
lineEnding="Enum" //行结束模式
archiveAboveSize="Long" //存档上限值
maxArchiveFiles="Integer" //保存的最大存档文件数,默认9
archiveFileName="Layout" //存档文件名称。允许使用Layout
archiveNumbering="Enum" //存档文件的编号方式
archiveEvery="Enum" //是否在每个设定时间刻自动存档日志文件
replaceFileContentsOnEachWrite="Boolean" //是否覆盖每次写入的日志内容,默认false
fileAttributes="Enum" //文件属性(只支持Windows)
fileName="Layout" //写入日志的文件名称 支持Layout
deleteOldFileOnStartup="Boolean" //启动时,是否删除旧的日志文件 。默认为false
enableFileDelete="Boolean" //否允许删除日志文件。默认为true
createDirs="Boolean" //是否允许自动创建(不存在的)目录。默认为true。
concurrentWrites="Boolean" //是否允许使用通过多个进程的方式,将日志信息并行写入文件中。,默认为true
openFileCacheTimeout="Integer" //文件保持打开状态的最大时间秒数
openFileCacheSize="Integer" //保持打开状态的文件数量
networkWrites="Boolean" //是否通过多线程由不同的网络主机并行向文件中写入日志默认false
concurrentWriteAttemptDelay="Integer"
concurrentWriteAttempts="Integer"
bufferSize="Integer" //日志文件缓存区大小(字节) 默认值为32768(32KB)
autoFlush="Boolean" //在每次日志信息后,是否自动刷新文件缓存区 默认true
keepFileOpen="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
配置的路径中中查看到,同时在生产环境建议将internalLogLevel
NLog自己的日志等级设置为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 variables
https://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