• NLog 2.0.0.2000 使用实例


    之前一直都是使用log4net,但是那令人生畏的维护速度,还是令我转向了NLog。首先我不确定各版本的差异,所以这里仅仅以我用的版本来写。其次,本文以基本应用为基准,不涉及复杂的配置方案。

    本文地址http://www.cnblogs.com/sorex/archive/2013/01/31/2887174.html

    O、情景(设想情景,各位请按自己需求进行变更)

    1.在Logs文件夹下,分日期文件夹记录每日的错误信息。

    2.在日期文件夹下,有All.log记录全部错误信息以及UI.log、BLL.log、DAL.log三个日志文件分别记录错误信息。

    3.同时在一个单独的MySQL数据库ProjectLogDB中的Logs表中记录错误信息。

    4.错误信息包含发生错误的时间、错误级别、堆栈信息、发生错误的方法、源文件路径及行号、错误内容、错误分类(UI、BLL、DAL)

    ok就是上面这些设定,没有其他的神马了。

    一、在项目中加入NLog的引用

    打开NuGet搜索NLog安装下面的4个

    image

    安装完成后会在项目中出现如下2个文件

    image

    二、设置日志记录

    1.打开NLog.config文件,首先我们搞的All.log

    <?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">
    	<!-- 定义参数:
    	${basedir}:系统路径
    	${shortdate}:短日期 yyyy-MM-dd(例:2013-01-31)
    	${basedir}/Logs/${shortdate}:即为在系统路径下的Logs文件夹下面的日期文件夹-->
    	<variable name="logDirectory" value="${basedir}/Logs/${shortdate}"/>
    	<targets>
    		<!-- 定义输出模板:
    		type="File":这个记录方式为文件类型
    		fileName="${logDirectory}/All.log":表示输出到文件All.log中
    		layout="...":输出文件中错误的显示格式
    		${logDirectory}:为上述定义的路径
    		${longdate}:输出长日期 yyyy-MM-dd HH:mm:ss.ffff(例:2013-01-31 14:49:21.2120)
    		${level}:错误等级(由低到高为Trace,Debug,Info,Warn,Error,Fatal)
    		${newline}:输出 新的一行
    		${stacktrace}:输出 堆栈信息
    		${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}:输出 命名空间.类名.方法名(文件路径:行号)
    		${message}:输出错误信息-->
    		<target xsi:type="File" name="AllFile" fileName="${logDirectory}/All.log"
    				layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    	</targets>
    	<rules>
    		<!-- 定义输出日志:
    		name="*":记录所有信息
    		minlevel="Trace":记录的最低错误级别为Trace
    		writeTo="AllFile":日志写入AllFile的target中-->
    		<logger name="*" minlevel="Trace" writeTo="AllFile" />
    	</rules>
    </nlog>

    2.将上面的AllFile的target复制3次修改名字为UI、BLL、DAL,添加相应的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">
    	<!-- 定义参数:
    	${basedir}:系统路径
    	${shortdate}:短日期 yyyy-MM-dd(例:2013-01-31)
    	${basedir}/Logs/${shortdate}:即为在系统路径下的Logs文件夹下面的日期文件夹-->
    	<variable name="logDirectory" value="${basedir}/Logs/${shortdate}"/>
    	<targets>
    		<!-- 定义输出模板:
    		type="File":这个记录方式为文件类型
    		fileName="${logDirectory}/All.log":表示输出到文件All.log中
    		layout="...":输出文件中错误的显示格式
    		${logDirectory}:为上述定义的路径
    		${longdate}:输出长日期 yyyy-MM-dd HH:mm:ss.ffff(例:2013-01-31 14:49:21.2120)
    		${level}:错误等级(由低到高为Trace,Debug,Info,Warn,Error,Fatal)
    		${newline}:输出 新的一行
    		${stacktrace}:输出 堆栈信息
    		${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}:输出 命名空间.类名.方法名(文件路径:行号)
    		${message}:输出错误信息-->
    		<target xsi:type="File" name="AllFile" fileName="${logDirectory}/All.log"
    				layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="UI" fileName="${logDirectory}/UI.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="BLL" fileName="${logDirectory}/BLL.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="DAL" fileName="${logDirectory}/DAL.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    	</targets>
    	<rules>
    		<!-- 定义输出日志:
    		name="*":记录所有信息
    		minlevel="Trace":记录的最低错误级别为Trace
    		writeTo="AllFile":日志写入AllFile的target中-->
    		<logger name="*" minlevel="Trace" writeTo="AllFile" />
    		<!-- 定义输出日志:
    		name="*.UI.*":记录包含.UI.的命名空间的所有信息(第一个*最好替换为固定的,例如我的UI层命名空间为J.UI那么这里就可以写J.UI.*)-->
    		<logger name="*.UI.*" minlevel="Trace" writeTo="UI" />
    		<logger name="*.BLL.*" minlevel="Trace" writeTo="BLL" />
    		<logger name="*.DAL.*" minlevel="Trace" writeTo="DAL" />
    	</rules>
    </nlog>

    3.到这里我们创建一个Class1来测试下,文件内容如下

    using NLog;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace J.BLL
    {
    	public class Class1
    	{
    		private static Logger logger = LogManager.GetCurrentClassLogger();
    
    		public void Test()
    		{
    			logger.Log(LogLevel.Debug, "this is at BLL Error");
    		}
    	}
    }

    4.我们得到的错误信息如下

    2013-01-31 14:49:21.3590        ■Debug
        ▲<no type>.lambda_method => HomeController.Index => Class1.Test
        ◇J.BLL.Class1.Test(d:\ProjectTest\J.BLL\Class1.cs:16)
        ◆this is at BLL Error
    
    ***************************************************************************

    5.输出到文件目前没有问题了,下面就来配置如何连接到MySQL,首先在ProjectLogDB中创建表Logs

    -- ----------------------------
    -- Table structure for `Logs`
    -- ----------------------------
    DROP TABLE IF EXISTS `Logs`;
    CREATE TABLE `Logs` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `CreateDate` datetime NOT NULL,
      `LogLevel` varchar(5) NOT NULL,
      `CallSite` varchar(5000) DEFAULT NULL,
      `Massage` longtext,
      `StackTrace` varchar(5000) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

    6.修改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">
    	<!-- 定义参数:
    	${basedir}:系统路径
    	${shortdate}:短日期 yyyy-MM-dd(例:2013-01-31)
    	${basedir}/Logs/${shortdate}:即为在系统路径下的Logs文件夹下面的日期文件夹-->
    	<variable name="logDirectory" value="${basedir}/Logs/${shortdate}"/>
    	<targets>
    		<!-- 定义输出模板:
    		type="File":这个记录方式为文件类型
    		fileName="${logDirectory}/All.log":表示输出到文件All.log中
    		layout="...":输出文件中错误的显示格式
    		${logDirectory}:为上述定义的路径
    		${longdate}:输出长日期 yyyy-MM-dd HH:mm:ss.ffff(例:2013-01-31 14:49:21.2120)
    		${level}:错误等级(由低到高为Trace,Debug,Info,Warn,Error,Fatal)
    		${newline}:输出 新的一行
    		${stacktrace}:输出 堆栈信息
    		${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}:输出 命名空间.类名.方法名(文件路径:行号)
    		${message}:输出错误信息-->
    		<target xsi:type="File" name="AllFile" fileName="${logDirectory}/All.log"
    				layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="UI" fileName="${logDirectory}/UI.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="BLL" fileName="${logDirectory}/BLL.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="DAL" fileName="${logDirectory}/DAL.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<!-- 定义输出到MySQL中:
    		type="Database":这个记录方式是数据库
    		dbProvider="MySql.Data.MySqlClient":使用MySQL的连接方式
    		connectionString="Server=XXX.XXX.XXX.XXX;Database=ProjectLogDB;Uid=XXX;Pwd=XXX;":数据库的连接字符串
    		commandText="insert into Logs(CreateDate,LogLevel,CallSite,Massage,StackTrace) values (@CreateDate,@LogLevel,@CallSite,@Massage,@StackTrace)":insert语句
    		<parameter name="CreateDate" layout="${longdate}" />对应到insert语句的参数的值-->
    		<target xsi:type="Database" name="AllDatabase" dbProvider="MySql.Data.MySqlClient"
    						connectionString="Server=XXX.XXX.XXX.XXX;Database=ProjectLogDB;Uid=XXX;Pwd=XXX;"
    						commandText="insert into Logs(CreateDate,LogLevel,CallSite,Massage,StackTrace) values (@CreateDate,@LogLevel,@CallSite,@Massage,@StackTrace)">
    			<parameter name="CreateDate" layout="${longdate}" />
    			<parameter name="LogLevel" layout="${level}" />
    			<parameter name="CallSite" layout="${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}" />
    			<parameter name="Massage" layout="${message}" />
    			<parameter name="StackTrace" layout="${stacktrace}" />
    		</target>
    	</targets>
    	<rules>
    		<!-- 定义输出日志:
    		name="*":记录所有信息
    		minlevel="Trace":记录的最低错误级别为Trace
    		writeTo="AllFile,AllDatabase":日志写入AllFile和AllDatabase的target中-->
    		<logger name="*" minlevel="Trace" writeTo="AllFile,AllDatabase" />
    		<!-- 定义输出日志:
    		name="*.UI.*":记录包含.UI.的命名空间的所有信息(第一个*最好替换为固定的,例如我的UI层命名空间为J.UI那么这里就可以写J.UI.*)-->
    		<logger name="*.UI.*" minlevel="Trace" writeTo="UI" />
    		<logger name="*.BLL.*" minlevel="Trace" writeTo="BLL" />
    		<logger name="*.DAL.*" minlevel="Trace" writeTo="DAL" />
    	</rules>
    </nlog>

    7.完整的无说明的配置文件如下

    <?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">
    	<variable name="logDirectory" value="${basedir}/Logs/${shortdate}"/>
    	<targets>
    		<target xsi:type="File" name="AllFile" fileName="${logDirectory}/All.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="UI" fileName="${logDirectory}/UI.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="BLL" fileName="${logDirectory}/BLL.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="File" name="DAL" fileName="${logDirectory}/DAL.log"
    			layout="${longdate}        ■${level}${newline}    ▲${stacktrace}${newline}    ◇${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}${newline}    ◆${message}${newline}${newline}***************************************************************************" />
    
    		<target xsi:type="Database" name="AllDatabase" dbProvider="MySql.Data.MySqlClient"
    						connectionString="Server=XXX.XXX.XXX.XXX;Database=ProjectLogDB;Uid=XXX;Pwd=XXX;"
    						commandText="insert into Logs(CreateDate,LogLevel,CallSite,Massage,StackTrace) values (@CreateDate,@LogLevel,@CallSite,@Massage,@StackTrace)">
    			<parameter name="CreateDate" layout="${longdate}" />
    			<parameter name="LogLevel" layout="${level}" />
    			<parameter name="CallSite" layout="${callsite:className=True:fileName=True:includeSourcePath=True:methodName=True}" />
    			<parameter name="Massage" layout="${message}" />
    			<parameter name="StackTrace" layout="${stacktrace}" />
    		</target>
    	</targets>
    	<rules>
    		<logger name="*" minlevel="Trace" writeTo="AllFile,AllDatabase" />
    		<logger name="*.UI.*" minlevel="Trace" writeTo="UI" />
    		<logger name="*.BLL.*" minlevel="Trace" writeTo="BLL" />
    		<logger name="*.DAL.*" minlevel="Trace" writeTo="DAL" />
    	</rules>
    </nlog>

    8.数据库中记录如下

    image

    三、总结

    NLog其实也是一个用起来蛮简单的工具,复杂的功能请到官网查询,以上示例仅供日常使用。

  • 相关阅读:
    痞子衡嵌入式:恩智浦MCU集成开发环境与开发工具教程
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.4)- 串行NOR Flash下载算法(Keil MDK工具篇)
    《痞子衡嵌入式半月刊》 第 17 期
    痞子衡嵌入式:恩智浦i.MX RT1xxx系列MCU硬件那些事(2.3)- 串行NOR Flash下载算法(J-Link工具篇)
    《痞子衡嵌入式半月刊》 第 16 期
    痞子衡嵌入式:关于做技术的工作态度方面的几点建议
    痞子衡嵌入式:MCUXpresso IDE下添加C++源文件进SDK工程编译的方法
    痞子衡嵌入式:职场上有效地向师傅请教问题的几点建议
    痞子衡职场经验与见闻感悟分享
    痞子衡嵌入式:IAR在线调试时设不同复位类型可能会导致i.MXRT下调试现象不一致(J-Link/DAPLink)
  • 原文地址:https://www.cnblogs.com/sorex/p/2887174.html
Copyright © 2020-2023  润新知