log4j以模式

时间:2018-05-13 00:33:07

标签: log4j log4j2

目前我还是喜欢:

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

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

我想要......

% - 60.60CML(但这当然不起作用)

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

有可能吗?

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

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

  

每个转化说明符都以百分号(%)开头,而且是   其次是可选的格式修饰符和转换字符 er 。该   转换标识 er 指定数据类型

     

模式解析器在读取转换标识 er 时知道它何时到达转换说明符的末尾。

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

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

  

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

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

1 个答案:

答案 0 :(得分:0)

基于@ 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());
        }
    }

}