介绍
NLog 是一个免费的.NET 日志平台,具有丰富的日志路由和管理功能。它可以轻松地为您的应用程序生成和管理高质量的日志,无论其大小或复杂性如何。
它可以处理从任何 .NET 语言发出的诊断消息,使用上下文信息对其进行扩充,根据您的偏好对其进行格式化,并将它们发送到一个或多个目标,例如文件或数据库。
GitHub
引用NLog
通过NuGet管理获取NLog包
注意!!!输出目标为数据库时,新版NLog5 要求安装NLog.DataBase,否则插入数据库会产生报错。
在打开页面中搜索NLog并进行安装,安装NLog,新版本无需安装Nlog.Config包
注意!!!输出目标为数据库时,新版NLog5 要求安装NLog.DataBase,否则插入数据库会产生报错。
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"
<!--这个命名空间里面的元素或者属性就必须要以xsi:这种方式来写
比如schemaLocation就是他的一个属性,所以写成xsi:schemaLocation
而默认命名空间不带类似xsi这种,其实xml标签名称有个专业叫法叫做QName,而如果没有前面的xsi:这种一般叫做NCName -->
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
<!-- 表示把定义这个命名空间的schema文件给引用进来,好让开发类型工具能够解析和验证你的xml文件是否符合语法规范 -->
autoReload="true"
<!-- 一旦启动程序,这时候NLog.config文件被读取后,知道程序再启动都不会再读取配置文件了。假如我们不想停掉程序,比如说服务器哪能说停就停哈。这就用上这个配置了,这个配置功能是,一旦你对配置文件修改,程序将会重新读取配置文件,也就是自动再配置。 -->
throwExceptions="false"
<!-- NLog日志系统抛出异常,throwExceptions="false"表示不会抛出异常,仍会输出到NLog文件中 -->
internalLogLevel="Off“
<!--日志级别 -->
internalLogFile="c:\temp\nlog-internal.log">
<!-- NLog内部日志文件位置 -->
<variable name="myvar" value="myvalue"/><!--定义配置文件中用到的变量 -->
<targets><!-- 定义日志的目标/输出 -->
<!--输出到文件-->
<target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
layout="${longdate} [${level:uppercase=true}] ${message}" />
<!--VS输出窗口-->
<target name="debugger" xsi:type="Debugger" layout="${longdate} [${level:uppercase=true}] ${message}"/>
<!--输出到控制台-->
<target name="console" xsi:type="Console" layout="${longdate} [${level:uppercase=true}] ${message}"/>
</targets>
<rules><!-- 定义日志的路由规则 -->
<logger name="*" minlevel="Trace" writeTo="f" />
<logger name="*" writeTo="debugger"/>
<logger name="*" writeTo="console"/>
</rules>
</nlog>
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=“Warn”
指定多个等级 如:levels=“Warn,Debug“以逗号隔开 指定等级范围
如:minlevel=“Warn” maxlevel=“Error”
Logger发邮件参数
<?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写入数据库参数
<?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配置
然后把NLog.config里面放在后面就行了。
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
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");
static void Main(string[] args)
{
Logger _logger = LogManager.GetCurrentClassLogger();
_logger.Trace("Trace Message");
_logger.Debug("DebugMessage");
_logger.Info("InfoMessage");
_logger.Error("Error Message");
_logger.Fatal("FatalMessage");
}