原文地址:http://www.cnblogs.com/sorex/archive/2013/01/31/2887174.html
--------------------------------------------------------------------------------------------
每条跟踪信息都包含一个记录等级(log level)信息,用来描述该条信息的重要性。NLog支持如下几种记录等级:
--------------------------------------------------------------------------------------------
之前一直都是使用log4net,但是那令人生畏的维护速度,还是令我转向了NLog。首先我不确定各版本的差异,所以这里仅仅以我用的版本来写。其次,本文以基本应用为基准,不涉及复杂的配置方案。
本文地址http://www.cnblogs.com/sorex/archive/2013/01/31/2887174.html
1.在Logs文件夹下,分日期文件夹记录每日的错误信息。
2.在日期文件夹下,有All.log记录全部错误信息以及UI.log、BLL.log、DAL.log三个日志文件分别记录错误信息。
3.同时在一个单独的MySQL数据库ProjectLogDB中的Logs表中记录错误信息。
4.错误信息包含发生错误的时间、错误级别、堆栈信息、发生错误的方法、源文件路径及行号、错误内容、错误分类(UI、BLL、DAL)。
ok就是上面这些设定,没有其他的神马了。
打开NuGet搜索NLog安装下面的4个
安装完成后会在项目中出现如下2个文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
<?
xml
version="1.0" encoding="utf-8" ?>
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
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
<?
xml
version="1.0" encoding="utf-8" ?>
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
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
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"
);
}
}
}
|
1
2
3
4
5
6
|
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
***************************************************************************
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-- ----------------------------
-- 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;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
<?
xml
version="1.0" encoding="utf-8" ?>
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
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
<?
xml
version="1.0" encoding="utf-8" ?>
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
>
|
NLog其实也是一个用起来蛮简单的工具,复杂的功能请到官网查询,以上示例仅供日常使用。