Log4j 2.0 - 将更多转换说明符填充为一个元素

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库不支持它.所以我的问题是:我怎样才能实现它?可能你可以写一个示例代码.我相信它也会帮助别人.

lit*_*ezz 6

我创建了一个自定义转换器,可以满足您的需求。它允许您在一个模式内对模式进行分组,并将这些组视为单个实体。例如,记号

%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)


Rem*_*pma 3

从 RC2 开始,Log4j2 不支持此功能。您可以在 Log4j2 Jira 问题跟踪器上提出功能请求。如果有补丁就太好了!

同时,如果您想对齐实际消息的开头,您可以有一个配置,其中线程名称和记录器名称的最小(填充)值等于最大(截断)值。我意识到这并不理想,但这只需配置即可实现。