logback自定義格式轉換器


創建自定義格式轉換符有兩步。
首先,必須繼承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了。不過呢……要怎么把這一行加進去呢?嗯……這是個問題。當然我已經找到方法咯。

http://www.cnblogs.com/yhlx/archive/2012/09/25/2701989.html

 

當然我們也可以自定義過濾器。

 

實現過程很簡單,我們只需要寫一個類實現filter接口就OK,里面實現decide()方法。

代碼如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. package org.linkinpark.commons.logbackLogging;  
  2.   
  3. import ch.qos.logback.classic.spi.ILoggingEvent;  
  4. import ch.qos.logback.core.filter.Filter;  
  5. import ch.qos.logback.core.spi.FilterReply;  
  6.   
  7. public class LinkinFilter extends Filter<ILoggingEvent>  
  8. {  
  9.   
  10.     @Override  
  11.     public FilterReply decide(ILoggingEvent event)  
  12.     {  
  13.         if (event.getMessage().contains("LinkinPark"))  
  14.         {  
  15.             return FilterReply.ACCEPT;  
  16.         }  
  17.         else  
  18.         {  
  19.             return FilterReply.DENY;  
  20.         }  
  21.     }  
  22.   
  23. }  


然后在配置文件中使用到該過濾器的地方配置<filter>就OK了。

 

 

[html]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. <!-- 控制台輸出,生產環境將請stdout去掉 -->  
  2.     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  
  3.         <filter class="org.linkinpark.commons.logbackLogging.LinkinFilter" />  
  4.         <encoder>  
  5.             <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日志消息,%n是換行符 -->  
  6.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n  
  7.             </pattern>  
  8.         </encoder>  
  9.     </appender>  

 

 

測試代碼如下:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. package org.linkinpark.commons.logbackLogging;  
  2.   
  3. import org.junit.Test;  
  4. import org.slf4j.Logger;  
  5. import org.slf4j.LoggerFactory;  
  6.   
  7. public class LoggingBack  
  8. {  
  9.   
  10.     private static Logger logger = LoggerFactory.getLogger(LoggingBack.class);  
  11.   
  12.     @Test  
  13.     public void test()  
  14.     {  
  15.         logger.debug("LoggingBack.debug()。。。");  
  16.         logger.info("LoggingBack.info(LinkinPark)。。。");  
  17.         logger.error("LoggingBack.error()。。。");  
  18.     }  
  19.   
  20. }  

 

 

運行上面的測試,我們來看下控制台輸出:

 

[java]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]  
  2. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]  
  3. 10:39:32,945 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/Users/LinkinPark/WorkSpace/linkin-log-test/target/classes/logback.xml]  
  4. 10:39:33,011 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Setting ReconfigureOnChangeFilter scanning period to 30 seconds  
  5. 10:39:33,012 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[/Users/LinkinPark/WorkSpace/linkin-log-test/target/classes/logback.xml]] every 30 seconds.   
  6. 10:39:33,012 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - Adding ReconfigureOnChangeFilter as a turbo filter  
  7. 10:39:33,014 |-INFO in ch.qos.logback.classic.joran.action.ContextNameAction - Setting logger context name as [Application]  
  8. 10:39:33,014 |-INFO in ch.qos.logback.core.joran.action.TimestampAction - Using context birth as time reference.  
  9. 10:39:33,015 |-INFO in ch.qos.logback.core.joran.action.TimestampAction - Adding property to the context with key="byDay" and value="2016-03-01" to the LOCAL scope  
  10. 10:39:33,016 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]  
  11. 10:39:33,018 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]  
  12. 10:39:33,038 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property  
  13. 10:39:33,064 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]  
  14. 10:39:33,066 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE]  
  15. 10:39:33,085 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used  
  16. 10:39:33,086 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/log-%d{yyyy-MM-dd}.%i.log for the active file  
  17. 10:39:33,088 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/log-%d{yyyy-MM-dd}.%i.log'.  
  18. 10:39:33,088 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - Roll-over at midnight.  
  19. 10:39:33,091 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@2096442d - Setting initial period to Tue Mar 01 10:39:13 CST 2016  
  20. 10:39:33,092 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property  
  21. 10:39:33,094 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - Active log file name: log/LoggingBack-2016-03-01.log  
  22. 10:39:33,094 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - File property is set to [log/LoggingBack-2016-03-01.log]  
  23. 10:39:33,095 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]  
  24. 10:39:33,095 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-INFO]  
  25. 10:39:33,099 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used  
  26. 10:39:33,099 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-INFO-%d{yyyy-MM-dd}.%i.log for the active file  
  27. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/LOG-INFO-%d{yyyy-MM-dd}.%i.log'.  
  28. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - Roll-over at midnight.  
  29. 10:39:33,100 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@7946e1f4 - Setting initial period to Tue Mar 01 10:39:13 CST 2016  
  30. 10:39:33,100 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property  
  31. 10:39:33,101 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-INFO] - Active log file name: log/LoggingBack-info.log  
  32. 10:39:33,101 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-INFO] - File property is set to [log/LoggingBack-info.log]  
  33. 10:39:33,101 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]  
  34. 10:39:33,101 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE-ERROR]  
  35. 10:39:33,103 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used  
  36. 10:39:33,103 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-ERROR-%d{yyyy-MM-dd}.%i.log for the active file  
  37. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/LOG-ERROR-%d{yyyy-MM-dd}.%i.log'.  
  38. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - Roll-over at midnight.  
  39. 10:39:33,103 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@3c09711b - Setting initial period to Tue Mar 01 10:39:13 CST 2016  
  40. 10:39:33,104 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property  
  41. 10:39:33,104 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-ERROR] - Active log file name: log/LoggingBack-error.log  
  42. 10:39:33,104 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[FILE-ERROR] - File property is set to [log/LoggingBack-error.log]  
  43. 10:39:33,105 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.rolling.RollingFileAppender]  
  44. 10:39:33,105 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [LOGGINGBACK2]  
  45. 10:39:33,106 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - No compression will be used  
  46. 10:39:33,106 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy - Will use the pattern log/LOG-%d{yyyy-MM-dd}.%i.log for the active file  
  47. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - The date pattern is 'yyyy-MM-dd' from file name pattern 'log/LOG-%d{yyyy-MM-dd}.%i.log'.  
  48. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - Roll-over at midnight.  
  49. 10:39:33,106 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@5cc7c2a6 - Setting initial period to Tue Mar 01 10:18:58 CST 2016  
  50. 10:39:33,107 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property  
  51. 10:39:33,107 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[LOGGINGBACK2] - Active log file name: log/LoggingBack2.log  
  52. 10:39:33,107 |-INFO in ch.qos.logback.core.rolling.RollingFileAppender[LOGGINGBACK2] - File property is set to [log/LoggingBack2.log]  
  53. 10:39:33,108 |-INFO in ch.qos.logback.classic.joran.action.LoggerAction - Setting additivity of logger [org.linkinpark.commons.logbackLogging] to true  
  54. 10:39:33,108 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE] to Logger[org.linkinpark.commons.logbackLogging]  
  55. 10:39:33,108 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE-INFO] to Logger[org.linkinpark.commons.logbackLogging]  
  56. 10:39:33,109 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [FILE-ERROR] to Logger[org.linkinpark.commons.logbackLogging]  
  57. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG  
  58. 10:39:33,109 |-INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]  
  59. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.  
  60. 10:39:33,109 |-INFO in ch.qos.logback.classic.joran.JoranConfigurator@2344fc66 - Registering current configuration as safe fallback point  
  61. 10:39:33.114 [main] INFO  o.l.c.logbackLogging.LoggingBack - LoggingBack.info(LinkinPark)。。。  
OK,只輸出了包含我們“LinkinPark”字符串的日志,沒問題。

 

2,log4j.propertites文件轉logback.xml文件。

打開logback官網,在左下角有一個在線轉log4j的配置文件成logback配置文件的工具,挺好的,我自己嘗試過,沒問題。

所以以后如果我們原來的項目用的是log4j的日志系統的話想切成logback的話,直接這里轉下配置文件,然后代碼一行都不用動,挺好的。

在線轉文件的地址如下:log4j.prorpertites轉成logback.xml文件

 

 

http://blog.csdn.net/u011794238/article/details/50770557


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM