jju*_*urm 7 java log4j padding log4j2
我想知道在Log4j 2.0库中是否有可能将更多的转换说明符连接在一起.
例如,这种模式
%d{HH:mm:ss,SSS} %-5p [%-10t] %-22c - %m%n
Run Code Online (Sandbox Code Playgroud)
产生类似的东西
12.25.34,788 INFO [SomeThread] my.path.to.Class - First logged message
12.25.34,789 FATAL [Thread2 ] other.path.SecondClass - Second logged message
12.25.34.790 WARN [Scheduler ] my.other.path.Class - Another message
Run Code Online (Sandbox Code Playgroud)
现在想象一下,我不仅要填充转换说明符,还要填充模式的整个部分.在这种情况下,例如,我想要填充[%-10t] %-22c.
12.25.34,788 INFO [SomeThread] my.path.to.Class - First logged message
12.25.34,789 FATAL [Thread2] other.path.SecondClass - Second logged message
12.25.34.790 WARN [Scheduler] my.other.path.Class - Another message
Run Code Online (Sandbox Code Playgroud)
符号可能是这样的
%d{HH:mm:ss,SSS} %-5p %-32{[%t] %c} - %m%n
Run Code Online (Sandbox Code Playgroud)
(注意%-35{...}- 我想填充此转换说明符的全部内容,就像一个项目一样)
我发现了这个类似的问题,但没有答案如何填充模式的自定义部分,只回答样本类扩展PatternLayout以生成格式的字符串Class:method.
另外,我想在两个元素之间添加填充,如下所示([%t]左对齐,%c右对齐):
12.25.34,788 INFO [SomeThread] my.path.to.Class - First logged message
12.25.34,789 FATAL [Thread2] other.path.SecondClass - Second logged message
12.25.34.790 WARN [Scheduler] my.other.path.Class - Another message
Run Code Online (Sandbox Code Playgroud)
似乎log4j库不支持它.所以我的问题是:我怎样才能实现它?可能你可以写一个示例代码.我相信它也会帮助别人.
我创建了一个自定义转换器,可以满足您的需求。它允许您在一个模式内对模式进行分组,并将这些组视为单个实体。例如,记号
%d{HH:mm:ss,SSS} %-5p %-32grp{[%t] %c} - %m%n
Run Code Online (Sandbox Code Playgroud)
将产生类似于您的第一个请求的输出:
12.25.34,788 INFO [SomeThread] my.path.to.Class - First logged message
12.25.34,789 FATAL [Thread2] other.path.SecondClass - Second logged message
12.25.34.790 WARN [Scheduler] my.other.path.Class - Another message
Run Code Online (Sandbox Code Playgroud)
不幸的是,转换器似乎没有任何方法可以知道它应该有多“长”,因此它本质上无法处理您的第二个请求,即输出左对齐和右对齐。但是,您可以修改您的模式以模拟以下行为:
%d{HH:mm:ss,SSS} %-5p %-16grp{[%t]} %16grp{%c} - %m%n
Run Code Online (Sandbox Code Playgroud)
这是我写的转换器:
@Plugin(name="GroupingPatternConverter", category="Converter")
@ConverterKeys({"grp"})
public class GroupingPatternConverter extends LogEventPatternConverter {
private final String pattern;
public static GroupingPatternConverter newInstance(String[] options) {
return new GroupingPatternConverter("grp", "grp", options);
}
private GroupingPatternConverter(String name, String style, String[] options) {
super(name, style);
if (options != null && options.length > 0) {
this.pattern = options[0];
} else {
this.pattern = null;
}
}
@Override
public void format(LogEvent event, StringBuilder toAppendTo) {
if (this.pattern == null) {
return;
}
PatternParser parser = new PatternParser(null, "Converter", LogEventPatternConverter.class);
List<PatternFormatter> formatters = parser.parse(this.pattern);
StringBuilder groupBuilder = new StringBuilder();
for (PatternFormatter formatter : formatters) {
formatter.format(event, groupBuilder);
}
toAppendTo.append(groupBuilder.toString());
}
}
Run Code Online (Sandbox Code Playgroud)
从 RC2 开始,Log4j2 不支持此功能。您可以在 Log4j2 Jira 问题跟踪器上提出功能请求。如果有补丁就太好了!
同时,如果您想对齐实际消息的开头,您可以有一个配置,其中线程名称和记录器名称的最小(填充)值等于最大(截断)值。我意识到这并不理想,但这只需配置即可实现。
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |