首页 > 解决方案 > log4j 在模式中设置类和方法摘要长度

问题描述

目前我有这样的:

%d{HH:mm:ss.SSS} | %-5.5p | %-15.15t | %-30.70C.%-5.20M:%-3.5L | %msg%n

但这使得 full.class.Name.method:line 的长度不同 - 是否可以制作 calss.method:line 的固定长度?

我喜欢

%-60.60CML(但这当然行不通)

我想让 calss.method.line 在所有日志行上具有相同的长度。(所以实际消息在同一个地方开始)

是否可以 ?

换句话说,是否可以使用一个转换说明符格式化多个转换字符?看着

https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html

每个转换说明符都以百分号 (%) 开头,后跟可选的格式修饰符和转换字符。转换字符指定数据类型

模式解析器在读取转换字符时知道何时到达转换说明符的末尾

现在写的是多个转换字符,所以也许根本不可能?


正如@Remko Popma 解释的那样,我想要的现在不可能:

不,每个修饰符都适用于一次转换。但是 Log4j 可以添加一个新的转换器,这意味着你想要什么。您可以在邮件列表或问题跟踪器上提出这样的新转换器。

我创建了问题:https ://issues.apache.org/jira/browse/LOG4J2-2339

标签: log4jlog4j2

解决方案


基于@Remko-Popma 的帮助

https://issues.apache.org/jira/browse/LOG4J2-2339

以下是对我有用的:

<property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5.5p | %-15.15t | %-70.70CML | %-10.70X | %msg%n</property>

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.pattern.ConverterKeys;
import org.apache.logging.log4j.core.pattern.NamePatternConverter;
import org.apache.logging.log4j.core.pattern.PatternConverter;

@Plugin(name = "ClassMethodLinePatternConverter", category = PatternConverter.CATEGORY)
@ConverterKeys({"CML", "classmethodline"})
public class ClassMethodLinePatternConverter extends NamePatternConverter {

    private static final String NA = "?";

    private ClassMethodLinePatternConverter(
        final String[] options) {
        super("Class Name", "class name", options);
    }

    public static ClassMethodLinePatternConverter newInstance(final String[] options) {
        return new ClassMethodLinePatternConverter(options);
    }

    /**
     * Format a logging event.
     *
     * @param event      event to format.
     * @param toAppendTo string buffer to which class name, method name and line will be appended.
     */
    @Override
    public void format(final LogEvent event, final StringBuilder toAppendTo) {
        final StackTraceElement element = event.getSource();
        if (element == null) {
            toAppendTo.append(NA);
        } else {
          toAppendTo.append(element.getClassName()).append(".").append(element.getMethodName()).append(":").append(element.getLineNumber());
        }
    }

}


推荐阅读