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了。不过呢……要怎么把这一行加进去呢?嗯……这是个问题。当然我已经找到方法咯。

     
  • 相关阅读:
    05. Spring Security 图形验证码
    Spring Security 登出
    03. Spring Security 异常处理
    02. Spring Security rememberMe
    Redirect和Forward的区别
    01. spring-security 初体验
    nextInt()和nextLine()注意点
    JavaBean
    05. Hystrix Dashboard
    bootstrap.yml 和 application.yml
  • 原文地址:https://www.cnblogs.com/yhlx/p/2701989.html
Copyright © 2011-2022 走看看