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,不够补空,运行的效果:

扩展

现在在现实开发中我们遇到了一个情况就是,需要将客户端访问的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>

看看运行效果

总结

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

优质内容筛选与推荐>>
1、Servlet——Filter过滤器
2、C# 线程手册 第三章 使用线程 Monitor.Wait() 和 Monitor.Pulse()
3、细说自增与自减操作符
4、友盟让用户数据动起来——给app增加运营
5、在线版Office 2010 Beta简体中文下载


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn