按照log4j2的设计——配置文件中的任何内容都属于一类plugin,所以Converters依然属于plugin——类型(category)为“Converter”的plugin。
“Converters are used by PatternLayout
to render the elements identified by the conversion pattern.”
<PatternLayout>
节点的pattern
属性所配置值的渲染问题。依然是让我们先来看看log4j2对于Converters的继承链的设计。
由以上类层次结构图中:
%X{xxx}
对应的则是MdcPatternConverter
;换行符%n
对应的LineSeparatorPatternConverter
;%d
对应的DatePatternConverter
;%p
对应的LevelPatternConverter
等等。下面我们将实现一个自定义的PatternConveter。
// 1. 必须将category属性的值指定为"Converter"
@Plugin(name = "LqPatternConverter", category = PatternConverter.CATEGORY)
// 2. 必须有一个@ConverterKeys的注解修饰,以便我们可以在配置时使用 %lq 进行选择。
@ConverterKeys({ "lq", "luoqi" })
@PerformanceSensitive("allocation")
public final class LqPatternConverter extends NamePatternConverter {
/** * Singleton. */
private static final LqPatternConverter INSTANCE =
new LqPatternConverter(null);
/** * Private constructor. * * @param options options, may be null. */
private LqPatternConverter(final String[] options) {
super("Lq", "lq", options);
}
// 3. 内部必须有一个满足特定签名约定的名为"newInstance"的静态public方法
// 此项约定的源码位置位于 PatternParser 类的私有方法 createConverter 中。
/** * Obtains an instance of pattern converter. * * @param options options, may be null. * @return instance of pattern converter. */
public static LqPatternConverter newInstance(
final String[] options) {
if (options == null || options.length == 0) {
return INSTANCE;
}
return new LqPatternConverter(options);
}
@Override
public void format(final LogEvent event, final StringBuilder toAppendTo) {
toAppendTo.append("LQ~18");
}
}
接下来我们就需要进行一些配置工作,让log4j2知道如何使用该Converter。
<!--使用packages属性告知log4j2我们自定义的plugin所在的package; 注意多个package是以 , 进行分割 -->
<Configuration status="TRACE" monitorInterval="5" packages="slf4j._log4j2.classes.core.pattern">
<!--注意调用方式 -->
<!-- 其中%lq, %luoqi为自定义; 其他则是log4j2默认提供的 -->
<PatternLayout pattern="[%p];[%tn];[%lq];[%luoqi] %n %msg %n %n" />
</Configuration>
相应的日志输出如下:
最后依然附上一张执行堆栈图:
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/lqzkcx3/article/details/82082274
内容来源于网络,如有侵权,请联系作者删除!