转自:http://www.cnblogs.com/Henllyee/archive/2010/03/06/1679744.html
在上篇文章中介绍几个主要的Appender的配置,本篇文章中介绍下如何编写Layout的配置,以及做些简单的扩展。
Layout组件的作用就是向用户显示格式化的输出信息。一个Appender对象只能有一个Layout对象。其中,我们可以通过继承log4net.Layout.LayoutSkeleton来实现自己的Layout组件。Log4net中提供了PatternLayout组件给来实现一个常用信息的输出。PatternLayout中包含了许多种PatternConverter,下面详细说下几种转换模式。
PatternConverter
1)NewLinePatternConverter
作用:换行;通配符:%newline,%n
2)LoggerPatternConverter
作用:显示Logger名;通配符:%logger,%c
3)TypeNamePatternConverter
作用:显示类名;通配符:%C,%class,%type
4)DatePatternConverter
作用:显示时间;通配符:%d,%date
5)ExceptionPatternConverter
作用:异常信息;通配符:%exception
6)LineLocationPatternConverter
作用:语句所在的行号;通配符:%L,%line
7)MessagePatternConverter
作用:信息内容;通配符:%message,%m
8)LevelPatternConverter
作用:消息等级;通配符:%level,%p
下面我们先来看一个配置的示例:
1.
<layout type=
"log4net.Layout.PatternLayout"
>
2.
<conversionPattern value=
"%date [%thread] %-5level %logger %message%newline"
/>
3.
</layout>
说下%-5的意思就是长度为5,不够补空,运行的效果:
扩展
现在在现实开发中我们遇到了一个情况就是,需要将客户端访问的IP、用户信息、等等信息记录到数据库中,我们可以通过自定义Layout来实现。首先来分析下PatternLayout的初始化方法:
01.
static
PatternLayout()
02.
{
03.
s_globalRulesRegistry =
new
Hashtable(45);
04.
05.
s_globalRulesRegistry.Add(
"literal"
,
typeof
(log4net.Util.PatternStringConverters.LiteralPatternConverter));
06.
s_globalRulesRegistry.Add(
"newline"
,
typeof
(log4net.Util.PatternStringConverters.NewLinePatternConverter));
07.
s_globalRulesRegistry.Add(
"n"
,
typeof
(log4net.Util.PatternStringConverters.NewLinePatternConverter));
08.
09.
s_globalRulesRegistry.Add(
"c"
,
typeof
(LoggerPatternConverter));
10.
s_globalRulesRegistry.Add(
"logger"
,
typeof
(LoggerPatternConverter));
11.
12.
...
13.
14.
s_globalRulesRegistry.Add(
"w"
,
typeof
(UserNamePatternConverter));
15.
s_globalRulesRegistry.Add(
"username"
,
typeof
(UserNamePatternConverter));
16.
}
因为我们所需要的功能只是多输出IP、用户信息等,所以只需要在首先添加自己的PatternConverter,然后再初始化时添加进去,首先来看自定义的PatternConvert:
01.
public
class
ClientIpPatternConvert : PatternLayoutConverter
02.
{
03.
protected
override
void
Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
04.
{
05.
var LogMessage = loggingEvent.MessageObject
as
SysLogMessage;
06.
if
(LogMessage !=
null
)
07.
writer.Write(LogMessage.Client_IP);
08.
}
09.
}
添加自己的layout来继承于PatternLayout:
01.
public
class
HJRightLayout:PatternLayout
02.
{
03.
public
HJRightLayout()
04.
{
05.
//添加Convert
06.
this
.AddConverter(
"UserName"
,
typeof
(UserNamePatternCovert));
07.
this
.AddConverter(
"Category"
,
typeof
(CategoryPatternCovert));
08.
this
.AddConverter(
"SysURL"
,
typeof
(SysURLPatternConvert));
09.
this
.AddConverter(
"ClientIP"
,
typeof
(ClientIpPatternConvert));
10.
this
.AddConverter(
"SysMessage"
,
typeof
(SysMessagePatternConvert));
11.
}
12.
}
1.
在来看看配置文件:
1.
<layout type=
"HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils"
>
2.
<conversionPattern value=
"%date [%thread] %-5level %logger - %SysMessage%newline"
/>
3.
</layout>
总结
本文中主要介绍了Layout的一些配置,以及很小的一个扩展,如果需要更为复杂的实现,可以通过继承于LayoutSkeleton,来实现。