zoukankan      html  css  js  c++  java
  • Logback创建自定义格式转换符[不用在配置文件里写rue]

    创建自定义格式转换符有两步。
    首先,必须继承ClassicConverter类。ClassicConverter对象负责从ILoggingEvent 提取
    信息,并产生一个字符串。例如,LoggerConverter,它是处理“% logger”转换符的转换器,
    它从ILoggingEvent提取logger 的名字并作为字符串返回。
    假设我们的自定义ClassicConverter的功能是按照ANSI终端惯例为记录事件的级别进
    行着色,下面是一种可能的实现:
    示例:样本转换器例子
    (src/main/java/chapters/layouts/MySampleConverter.java)

    package chapters.layouts; 
     
    import ch.qos.logback.classic.Level; 
    import ch.qos.logback.classic.pattern.ClassicConverter; 
    import ch.qos.logback.classic.spi.ILoggingEvent; 
     
    public class MySampleConverter extends ClassicConverter { 
     
      private static final String END_COLOR = "\u001b[m"; 
     
      private static final String ERROR_COLOR = "\u001b[0;31m"; 
      private static final String WARN_COLOR = "\u001b[0;33m"; 
     
      @Override 
      public String convert(ILoggingEvent event) { 
        StringBuffer sbuf = new StringBuffer(); 
        sbuf.append(getColor(event.getLevel())); 
        sbuf.append(event.getLevel()); 
        sbuf.append(END_COLOR); 
        return sbuf.toString(); 
      }
    
      /** 
       * Returns the appropriate characters to change the color for the 
    specified 
       * logging level. 
       */ 
      private String getColor(Level level) { 
        switch (level.toInt()) { 
        case Level.ERROR_INT: 
          return ERROR_COLOR; 
        case Level.WARN_INT: 
          return WARN_COLOR; 
        default: 
          return ""; 
        } 
      } 
    } 

    这里的实现很直观。MySampleConverter类继承ClassicConverter,实现convert方法,
    convert方法返回按照ANSI着色编码装饰后的字符串。

    第二步,我们必须让logback 知道这个新的Converter。方法是在配置里声明新的转换符。
    示例:样本转换器例子
    (src/main/java/chapters/layouts/mySampleConverterConfig.xml)

    <configuration> 
     <conversionRule conversionWord="sample"  converterClass="chapters.layouts.MySampleConverter" /> 
     <appender name="STDOUT" 
    class="ch.qos.logback.core.ConsoleAppender"> 
        <encoder> 
          <pattern>%-4relative [%thread] %sample - %msg%n</pattern> 
        </encoder> 
      </appender> 
     
      <root level="DEBUG"> 
        <appender-ref ref="STDOUT" /> 
      </root> 
    
    </configuration> 

    新的转换符号在配置文件里被声明后,我们可以在PatternLayout模式里像引用任何其
    他转换符一样引用它。

    由于Windows不支持ANSI终端编码,你可以在其他平台如Linux或Mac上执行看到

    效果。
    执行:

    java  chapters.layouts.SampleLogging src/main/java/chapters/layouts/mySampleConverterConfig.xml 

    输出:

    0        [main] DEBUG - Everything's going  well 
    3        [main] ERROR - maybe not quite... 

    请注意“ERROR”是红色的,也正是本例的目的。 

    这只是基本的,这个方法不好的地方就是要在配置文件里写

     <conversionRule conversionWord="sample" converterClass="chapters.layouts.MySampleConverter" /> 

    实际只要模仿logback原生创建的方法把这个转换符加进去就可以了!

    ch.qos.logback.classic.PatternLayout.java

    package ch.qos.logback.classic;
    
    import java.util.HashMap;
    import ...........;
    /**
     * <p>
     * A flexible layout configurable with pattern string. The goal of this class is
     * to {@link #format format} a {@link ILoggingEvent} and return the results in a
     * {#link String}. The format of the result depends on the
     * <em>conversion pattern</em>.
     * <p>
     * For more information about this layout, please refer to the online manual at
     * http://logback.qos.ch/manual/layouts.html#PatternLayout
     * 
     */
    
    public class PatternLayout extends PatternLayoutBase<ILoggingEvent> {
    
      public static final Map<String, String> defaultConverterMap = new HashMap<String, String>();
      public static final String HEADER_PREFIX = "#logback.classic pattern: ";
      
      static {
        defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
    
        defaultConverterMap.put("d", DateConverter.class.getName());
        defaultConverterMap.put("date", DateConverter.class.getName());
    
        defaultConverterMap.put("r", RelativeTimeConverter.class.getName());
        defaultConverterMap.put("relative", RelativeTimeConverter.class.getName());
    
        defaultConverterMap.put("level", LevelConverter.class.getName());
        defaultConverterMap.put("le", LevelConverter.class.getName());
        defaultConverterMap.put("p", LevelConverter.class.getName());
    
       ....
    
      }... 
    }

    看到没?只要在static块里加入

    defaultConverterMap.put("highlight", HighlightingCompositeConverter.class.getName());

    map的KEY是转换符,Value是对应的Converter。

    这样就不用在配置文件里写RULE了。不过呢……要怎么把这一行加进去呢?嗯……这是个问题。当然我已经找到方法咯。

     
  • 相关阅读:
    微信小程序HTTPS
    微信商城-1简介
    va_list
    Event log c++ sample.
    EVENT LOGGING
    Analyze Program Runtime Stack
    unknow table alarmtemp error when drop database (mysql)
    This application has request the Runtime to terminate it in an unusual way.
    How to check if Visual Studio 2005 SP1 is installed
    SetUnhandledExceptionFilter
  • 原文地址:https://www.cnblogs.com/yhlx/p/2701989.html
Copyright © 2011-2022 走看看