最近在好好整理些小组件的使用,本文就Log4Net的使用做一个简单的说明。
准备工作
首先下载log4net相关资源:http://logging.apache.org/log4net/download.html
本文中还使用了NUnit。
log4net的组成
log4net主要由Logger、Appender、Repository、Layout
1)Logger
Logger是log4net主要部分,是来产生日志消息。在log4net中提供了LogManager类来产生ILog:
1.
LogManager.GetLogger(LogName)
在ILog提供了:Erro、Info、Debug、Warn四个重载方法来记录日志。
2)Appender
Appender是用来产生日志生成的目的地。Log4Net可以将消息生成到多个目的地,可以轻松通过配置多种Appender组件来实现,当必要的时候我们也可以通过扩张Appender来实现我们需要的截至方式。
3)Repository
Respository用户维护日志对象的结构。除非我们需要扩展log4net时,一般时候是不会用到Respository组件。
4)Layout
Layout是格式化消息输出形式的组件。Layout提供给我们了灵活而又简单消息格式化方式。
log4net消息的级别
级别 | 对应方法 |
OFF | |
Fatal | void Fatal(…) |
Error | void Error(…) |
Warn | void Warn(…) |
Info | void Info(…) |
Debug | void Debug(…) |
All |
消息的级别按照上面的表格由上到下,由高到底的顺序,即OFF>Fatal>Error>Warn>Info>Debug>All。我们可以通过这样的消息的级别进行消息在Appender时进行行AppenderFiter。
配置
log4net的配置可以通过放在新的文件中或者放在程序的配置文件中。而log4net会通过AppDomain.CurrentDomain.BaseDirectory目录下的查找配置文件。<log4net>是log4net查找的标识。先来看我们应用程序的一个配置:
001.
<?xml version=
"1.0"
encoding=
"utf-8"
?>
002.
<log4net>
003.
<appender name=
"LogAllToFile"
type=
"log4net.Appender.FileAppender"
>
004.
<file value=
"G:/学习资料/Log4Net/Log4NetDemo/Log4NetDemo/bin/Debug/DemoLog.log"
/>
005.
<appendToFile value=
"true"
/>
006.
<!--<layout type=
"log4net.Layout.PatternLayout"
>
007.
<conversionPattern value=
"%d [%t] %-5l - %m%n%n"
/>
008.
</layout>-->
009.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
010.
<conversionPattern value=
"%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline"
/>
011.
</layout>
012.
</appender>
013.
<appender name=
"RollingLogFileAppender"
type=
"log4net.Appender.RollingFileAppender"
>
014.
<param name=
"File"
value=
"log/system_log_"
/>
015.
<param name=
"AppendToFile"
value=
"true"
/>
016.
<param name=
"MaxSizeRollBackups"
value=
"100"
/>
017.
<param name=
"MaximumFileSize"
value=
"1KB"
/>
018.
<param name=
"StaticLogFileName"
value=
"false"
/>
019.
<param name=
"DatePattern"
value=
"yyyyMMdd".log""
/>
020.
<param name=
"RollingStyle"
value=
"Date"
/>
021.
<!--<layout type=
"log4net.Layout.PatternLayout"
>
022.
<conversionPattern value=
"%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"
/>
023.
</layout>-->
024.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
025.
<conversionPattern value=
"%date [%thread] %-5level %logger [%property{NDC}] - %SysMessage%newline"
/>
026.
</layout>
027.
</appender>
028.
<appender name=
"ConsoleAppender"
029.
type=
"log4net.Appender.ConsoleAppender"
>
030.
<layout type=
"log4net.Layout.PatternLayout"
>
031.
<param name=
"ConversionPattern"
032.
value=
"%d [%t] %-5p %c [%x] - %m%n"
/>
033.
</layout>
034.
</appender>
035.
036.
037.
<appender name=
"ADONetAppender"
type=
"log4net.Appender.ADONetAppender"
>
038.
<!--BufferSize为缓冲区大小-->
039.
<param name=
"BufferSize"
value=
"1"
/>
040.
<connectionType value=
"System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
/>
041.
<connectionString value=
"database=HJRightPlat;server=(local);User ID=sa;Password=123456;"
/>
042.
<commandText value=
"INSERT INTO Sys_Log ([Date],[Thread],[Log_Level],[Logger],[Message],[Exception],[User],[Category],[URL],[Client_IP]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@User,@Category,@URL,@ClientIp)"
/>
043.
<parameter>
044.
<parameterName value=
"@log_date"
/>
045.
<dbType value=
"DateTime"
/>
046.
<layout type=
"log4net.Layout.RawTimeStampLayout"
/>
047.
</parameter>
048.
<parameter>
049.
<parameterName value=
"@thread"
/>
050.
<dbType value=
"String"
/>
051.
<size value=
"255"
/>
052.
<layout type=
"log4net.Layout.PatternLayout"
>
053.
<conversionPattern value=
"%thread"
/>
054.
</layout>
055.
</parameter>
056.
<parameter>
057.
<parameterName value=
"@log_level"
/>
058.
<dbType value=
"String"
/>
059.
<size value=
"50"
/>
060.
<layout type=
"log4net.Layout.PatternLayout"
>
061.
<conversionPattern value=
"%level"
/>
062.
</layout>
063.
</parameter>
064.
<parameter>
065.
<parameterName value=
"@logger"
/>
066.
<dbType value=
"String"
/>
067.
<size value=
"255"
/>
068.
<layout type=
"log4net.Layout.PatternLayout"
>
069.
<conversionPattern value=
"%logger"
/>
070.
</layout>
071.
</parameter>
072.
<parameter>
073.
<parameterName value=
"@message"
/>
074.
<dbType value=
"String"
/>
075.
<size value=
"4000"
/>
076.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
077.
<conversionPattern value=
"%SysMessage"
/>
078.
</layout>
079.
</parameter>
080.
<parameter>
081.
<parameterName value=
"@exception"
/>
082.
<dbType value=
"String"
/>
083.
<size value=
"2000"
/>
084.
<layout type=
"log4net.Layout.ExceptionLayout"
/>
085.
</parameter>
086.
<parameter>
087.
<parameterName value=
"@User"
/>
088.
<dbType value=
"String"
/>
089.
<size value=
"50"
/>
090.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
091.
<conversionPattern value=
"%UserName"
/>
092.
</layout>
093.
</parameter>
094.
<parameter>
095.
<parameterName value=
"@Category"
/>
096.
<dbType value=
"String"
/>
097.
<size value=
"50"
/>
098.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
099.
<conversionPattern value=
"%Category"
/>
100.
</layout>
101.
</parameter>
102.
<parameter>
103.
<parameterName value=
"@URL"
/>
104.
<dbType value=
"String"
/>
105.
<size value=
"50"
/>
106.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
107.
<conversionPattern value=
"%SysURL"
/>
108.
</layout>
109.
</parameter>
110.
<parameter>
111.
<parameterName value=
"@ClientIp"
/>
112.
<dbType value=
"String"
/>
113.
<size value=
"50"
/>
114.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
115.
<conversionPattern value=
"%ClientIP"
/>
116.
</layout>
117.
</parameter>
118.
</appender>
119.
120.
121.
122.
<root>
123.
<priority value=
"ALL"
/>
124.
<!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
125.
<appender-
ref
ref
=
"LogAllToFile"
/>
126.
<appender-
ref
ref
=
"ConsoleAppender"
/>
127.
<appender-
ref
ref
=
"RollingLogFileAppender"
/>
128.
<appender-
ref
ref
=
"ADONetAppender"
/>
129.
</root>
130.
</log4net>
在上面的配置中我们使用了ADONetAppender、LogAllToFile、ConsoleAppender、RollingLogFileAppender四种appender,其中ADONetAppderder中我们使用了些扩展,在后面会详细进行说明。下面说说各个配置节点:
1)Root:在Root中我们可以来指定消息级别,在上面种我们指定为“ALL”,同时我们也可以指定Appender的引用对象。
2)Appender:我们通过Appender配置节点来指定对应的各种方式的Appender,Appender节点可以是多种的。
应用
首先来看我们定义了一个系统消息的实体:
01.
public
class
SysLogMessage
02.
{
03.
/// <summary>
04.
/// 用户名
05.
/// </summary>
06.
public
string
UserName
07.
{
08.
get
;
09.
set
;
10.
}
11.
/// <summary>
12.
/// 分类
13.
/// </summary>
14.
public
string
Category
15.
{
16.
get
;
17.
set
;
18.
}
19.
/// <summary>
20.
/// 访问的Web地址
21.
/// </summary>
22.
public
string
URL
23.
{
24.
get
;
25.
set
;
26.
}
27.
/// <summary>
28.
/// 客户端IP
29.
/// </summary>
30.
public
string
Client_IP
31.
{
32.
get
;
33.
set
;
34.
}
35.
/// <summary>
36.
/// 消息记录
37.
/// </summary>
38.
public
string
Message
39.
{
40.
get
;
41.
set
;
42.
}
43.
}
用单件模式定义了一个消息的管理类:
1.
01.
public
class
SysLogManager
02.
{
03.
#region Thread-safe, lazy Singleton
04.
SysLogManager() {
this
.InitLogManager(); }
05.
public
static
SysLogManager Instance {
06.
get
{
07.
return
Nested.LogManager;
08.
}
09.
}
10.
private
class
Nested {
11.
static
Nested() { }
12.
internal
static
readonly
SysLogManager LogManager =
new
SysLogManager();
13.
}
14.
private
void
InitLogManager()
15.
{
16.
XmlConfigurator.Configure(BaseDataCache.log4netConfig);
17.
_Log = LogManager.GetLogger(LogName);
18.
19.
}
20.
#endregion
21.
#region Help Methods And Fileds
22.
ILog _Log;
23.
string
LogName =
"HJRightLog"
;
24.
#endregion
25.
public
void
Erro(SysLogMessage msg)
26.
{
27.
_Log.Error(msg);
28.
}
29.
public
void
Erro(SysLogMessage msg, Exception e)
30.
{
31.
_Log.Error(msg, e);
32.
}
33.
public
void
Info(SysLogMessage msg)
34.
{
35.
_Log.Info(msg);
36.
}
37.
public
void
Info(SysLogMessage msg, Exception e)
38.
{
39.
_Log.Info(msg, e);
40.
}
41.
public
void
Debug(SysLogMessage msg)
42.
{
43.
_Log.Debug(msg);
44.
}
45.
public
void
Debug(SysLogMessage msg, Exception e)
46.
{
47.
_Log.Debug(msg, e);
48.
}
49.
public
void
Warn(SysLogMessage msg)
50.
{
51.
_Log.Warn(msg);
52.
}
53.
public
void
Warn(SysLogMessage msg, Exception e)
54.
{
55.
_Log.Warn(msg, e);
56.
}
57.
}
看看测试代码:
01.
[Test]
02.
public
void
TestLogErro()
03.
{
04.
_logM.Erro(
new
SysLogMessage{
05.
Message=
"测试"
,
06.
UserName=
"Henllyee"
,
07.
Category=
"Debug"
,
08.
URL=
"http://henllyee.cnblogs.com"
09.
});
10.
11.
}
结果:
ConsleAppender:
RollingLogFileAppender:
AdoNetAppender:
总结
本文中概括地介绍了下log4net的使用,在下篇的文章中将会详细说明下多个常用的Appender。