Logback创建自定义格式转换符[不用在配置文件里写rue]
2012-09-25 18:08
239 查看
创建自定义格式转换符有两步。
首先,必须继承ClassicConverter类。ClassicConverter对象负责从ILoggingEvent提取
信息,并产生一个字符串。例如,LoggerConverter,它是处理“%logger”转换符的转换器,
它从ILoggingEvent提取logger的名字并作为字符串返回。
假设我们的自定义ClassicConverter的功能是按照ANSI终端惯例为记录事件的级别进
行着色,下面是一种可能的实现:
示例:样本转换器例子
(src/main/java/chapters/layouts/MySampleConverter.java)
这里的实现很直观。MySampleConverter类继承ClassicConverter,实现convert方法,
convert方法返回按照ANSI着色编码装饰后的字符串。
第二步,我们必须让logback知道这个新的Converter。方法是在配置里声明新的转换符。
示例:样本转换器例子
(src/main/java/chapters/layouts/mySampleConverterConfig.xml)
新的转换符号在配置文件里被声明后,我们可以在PatternLayout模式里像引用任何其
他转换符一样引用它。
由于Windows不支持ANSI终端编码,你可以在其他平台如Linux或Mac上执行看到
效果。
执行:
输出:
请注意“ERROR”是红色的,也正是本例的目的。
这只是基本的,这个方法不好的地方就是要在配置文件里写
实际只要模仿logback原生创建的方法把这个转换符加进去就可以了!
ch.qos.logback.classic.PatternLayout.java
看到没?只要在static块里加入
map的KEY是转换符,Value是对应的Converter。
这样就不用在配置文件里写RULE了。不过呢……要怎么把这一行加进去呢?嗯……这是个问题。当然我已经找到方法咯。
首先,必须继承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了。不过呢……要怎么把这一行加进去呢?嗯……这是个问题。当然我已经找到方法咯。
相关文章推荐
- 【spring boot logback】日志使用自定义的logback-spring.xml文件后,application.properties中关于日志的相关配置还会起作用么
- 自定义java.policy配置(如何让你的类禁止读写文件?禁止创建Socket对象?)
- 自定义java.policy配置(如何让你的类禁止读写文件?禁止创建Socket对象?)
- 自定义java.policy配置(如何让你的类禁止读写文件?禁止创建Socket对象?)
- ueditor上传图片时目录创建失败的问题解决方法,不用那么麻烦,其实修改php/config.json这个配置文件里面的路径就行!!
- 【spring boot logback】日志颜色渲染,使用logback-spring.xml自定义的配置文件后,日志没有颜色了
- 学习Spring Cloud第九课(使用配置文件自定义Ribbon Client)
- .net如何自定义config配置文件节点
- xen创建虚机配置文件
- springboot 自定义配置文件
- dotnet core 自定义配置文件
- Java中通过配置文件创建Mysql数据库连接
- App.config和Web.config配置文件的自定义配置节点
- [翻]为自定义MFC文件格式创建缩略图
- Spring自定义配置文件读取类
- macOS创建修改.bash_profile配置文件
- 以Java属性文件的格式创建Hibernate的配置文件和DTD特殊符号作用
- 使用logback.xml配置来实现日志文件输出
- SLF4J 之logback.xml配置文件实例及其说明
- IntelliJ IDEA 学习笔记 - Hello World 项目创建与配置文件介绍