之前一直都是使用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個
安裝完成后會在項目中出現如下2個文件
二、設置日志記錄
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.數據庫中記錄如下
三、總結
NLog其實也是一個用起來蠻簡單的工具,復雜的功能請到官網查詢,以上示例僅供日常使用。