Log4Net Layout使用以及扩展


在上篇文章中介绍几个主要的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
2
3
<layout type= "log4net.Layout.PatternLayout" >
     <conversionPattern value= "%date [%thread] %-5level %logger  %message%newline"  />
</layout>

说下%-5的意思就是长度为5,不够补空,运行的效果:

image

扩展

现在在现实开发中我们遇到了一个情况就是,需要将客户端访问的IP、用户信息、等等信息记录到数据库中,我们可以通过自定义Layout来实现。首先来分析下PatternLayout的初始化方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static  PatternLayout()
{
     s_globalRulesRegistry = new  Hashtable(45);
  
     s_globalRulesRegistry.Add( "literal" , typeof (log4net.Util.PatternStringConverters.LiteralPatternConverter));
     s_globalRulesRegistry.Add( "newline" , typeof (log4net.Util.PatternStringConverters.NewLinePatternConverter));
     s_globalRulesRegistry.Add( "n" , typeof (log4net.Util.PatternStringConverters.NewLinePatternConverter));
  
     s_globalRulesRegistry.Add( "c" , typeof (LoggerPatternConverter));
     s_globalRulesRegistry.Add( "logger" , typeof (LoggerPatternConverter));
  
     ...
  
     s_globalRulesRegistry.Add( "w" , typeof (UserNamePatternConverter));
     s_globalRulesRegistry.Add( "username" , typeof (UserNamePatternConverter));
}

 

因为我们所需要的功能只是多输出IP、用户信息等,所以只需要在首先添加自己的PatternConverter,然后再初始化时添加进去,首先来看自定义的PatternConvert:

1
2
3
4
5
6
7
8
9
10
public  class  ClientIpPatternConvert : PatternLayoutConverter
{
 
     protected  override  void  Convert(System.IO.TextWriter writer, LoggingEvent loggingEvent)
     {
         var LogMessage = loggingEvent.MessageObject as  SysLogMessage;
         if  (LogMessage != null )
             writer.Write(LogMessage.Client_IP);
     }
}

添加自己的layout来继承于PatternLayout:

1
2
3
4
5
6
7
8
9
10
11
12
public  class  HJRightLayout:PatternLayout
{
     public  HJRightLayout()
    
         //添加Convert
         this .AddConverter( "UserName" , typeof (UserNamePatternCovert));
         this .AddConverter( "Category" , typeof (CategoryPatternCovert));
         this .AddConverter( "SysURL" , typeof (SysURLPatternConvert));
         this .AddConverter( "ClientIP" , typeof (ClientIpPatternConvert));
         this .AddConverter( "SysMessage" , typeof (SysMessagePatternConvert));
     }
}
1
在来看看配置文件:
1
2
3
<layout type= "HJRight.ProjectBase.Utils.Log.Extentions.HJRightLayout,HJRight.ProjectBase.Utils" >
     <conversionPattern value= "%date [%thread] %-5level %logger - %SysMessage%newline"  />
</layout>

看看运行效果

image

总结

本文中主要介绍了Layout的一些配置,以及很小的一个扩展,如果需要更为复杂的实现,可以通过继承于LayoutSkeleton,来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值