我想知道在Log4j 2.0库中是否可以填充更多连接在一起的转换说明符。
例如,这种模式
%d{HH:mm:ss,SSS} %-5p [%-10t] %-22c - %m%n
产生类似
的东西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
现在想象一下,我不仅要填充转换说明符,还要填充模式的整个部分。在这种情况下,例如,我想填充[%-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
符号可能类似
%d{HH:mm:ss,SSS} %-5p %-32{[%t] %c} - %m%n
(注意%-35{...}
- 我想填充此转化说明符的全部内容,就像一个项目一样)
我找到this similar question,但没有答案如何填充模式的自定义部分,只回答扩展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
似乎log4j库不支持它。所以我的问题是:我如何实现它?您可以编写示例代码。我相信它也会帮助别人。
答案 0 :(得分:3)
我创建了一个自定义转换器,可以用于您想要做的事情。它允许您在模式中对模式进行分组,并将组视为单个实体。例如,符号
%d{HH:mm:ss,SSS} %-5p %-32grp{[%t] %c} - %m%n
将产生类似于您的第一个请求的输出:
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
不幸的是,转换器似乎没有任何方法可以知道" long"它应该是,所以它不能固有地处理你的第二个输出请求左右对齐。但是,您可以使用以下内容修改模式以模仿行为:
%d{HH:mm:ss,SSS} %-5p %-16grp{[%t]} %16grp{%c} - %m%n
这是我写的转换器:
@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());
}
}
答案 1 :(得分:2)
从RC2开始,Log4j2不支持此功能。您可以在Log4j2 Jira问题跟踪器上发出功能请求。补丁会很棒!
同时,如果要对齐实际消息的开头,可以使用一个配置,其中最小(填充)值等于线程名称和记录器名称的最大(截断)值。我意识到这并不理想,但只需配置即可实现。