• Log4Net笔记(三)Layout使用以及扩展(转)


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

    image

    扩展

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

    image

    总结

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

  • 相关阅读:
    ORA01157、01110问题解决
    [转]WebService 中Maximum request length exceeded. 产生错误的原因,以及解决方法.
    [转]oracle9 startup时 报错ORA00600: 参数: [kcratr1_lostwrt]
    [转]八个dos命令
    [转]如何让ActiveX OCX控件下载并自动更新
    ora12154错误
    [转]Oracle分页
    [转]客户端连接数据库报错,ORA12516: TNS: 监听程序无法找到匹配协议栈的可用句柄
    vue中使用on事件被覆盖
    移动端滑动插件
  • 原文地址:https://www.cnblogs.com/millen/p/1680912.html
Copyright © 2020-2023  润新知