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

时间:2014-07-01 17:18:28

标签: java log4j padding log4j2

我想知道在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库不支持它。所以我的问题是:我如何实现它?您可以编写示例代码。我相信它也会帮助别人。

2 个答案:

答案 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问题跟踪器上发出功能请求。补丁会很棒!

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