您的位置:首页 > 产品设计 > UI/UE

Logback创建自定义格式转换符[不用在配置文件里写rue]

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

packagechapters.layouts;

importch.qos.logback.classic.Level;
importch.qos.logback.classic.pattern.ClassicConverter;
importch.qos.logback.classic.spi.ILoggingEvent;

publicclassMySampleConverterextendsClassicConverter{

privatestaticfinalStringEND_COLOR="\u001b[m";

privatestaticfinalStringERROR_COLOR="\u001b[0;31m";
privatestaticfinalStringWARN_COLOR="\u001b[0;33m";

@Override
publicStringconvert(ILoggingEventevent){
StringBuffersbuf=newStringBuffer();
sbuf.append(getColor(event.getLevel()));
sbuf.append(event.getLevel());
sbuf.append(END_COLOR);
returnsbuf.toString();
}

/**
*Returnstheappropriatecharacterstochangethecolorforthe
specified
*logginglevel.
*/
privateStringgetColor(Levellevel){
switch(level.toInt()){
caseLevel.ERROR_INT:
returnERROR_COLOR;
caseLevel.WARN_INT:
returnWARN_COLOR;
default:
return"";
}
}
}


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

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

<configuration>
<conversionRuleconversionWord="sample"converterClass="chapters.layouts.MySampleConverter"/>
<appendername="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-4relative[%thread]%sample-%msg%n</pattern>
</encoder>
</appender>

<rootlevel="DEBUG">
<appender-refref="STDOUT"/>
</root>

</configuration>


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

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

效果。
执行:

javachapters.layouts.SampleLoggingsrc/main/java/chapters/layouts/mySampleConverterConfig.xml


输出:

0[main]DEBUG-Everything'sgoingwell
3[main]ERROR-maybenotquite...


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

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

<conversionRuleconversionWord="sample"converterClass="chapters.layouts.MySampleConverter"/>


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

ch.qos.logback.classic.PatternLayout.java

packagech.qos.logback.classic;

importjava.util.HashMap;
import...........;
/**
*<p>
*Aflexiblelayoutconfigurablewithpatternstring.Thegoalofthisclassis
*to{@link#formatformat}a{@linkILoggingEvent}andreturntheresultsina
*{#linkString}.Theformatoftheresultdependsonthe
*<em>conversionpattern</em>.
*<p>
*Formoreinformationaboutthislayout,pleaserefertotheonlinemanualat
*http://logback.qos.ch/manual/layouts.html#PatternLayout*
*/

publicclassPatternLayoutextendsPatternLayoutBase<ILoggingEvent>{

publicstaticfinalMap<String,String>defaultConverterMap=newHashMap<String,String>();
publicstaticfinalStringHEADER_PREFIX="#logback.classicpattern:";

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


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: