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