log4j设置模式中的类和方法摘要长度

wd2eg0qa  于 2022-11-06  发布在  其他
关注(0)|答案(2)|浏览(173)

目前我有这样的东西:
%d{时:分:秒.秒}| %-5.5便士|%-15.15吨|%-30.70摄氏度。%-5.20摄氏度:%-3.5升|%消息%n
但这会使full.class.Name.method:行的长度不同--有可能使clss.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

qnyhuwrf

qnyhuwrf1#

抱歉,我在问题中没有发现Log4j是1.x,此答案适用于Log4j 2.x。以下答案仅供可能需要它的人使用:
您可以使用style{pattern}{ANSI style}转换模式,只需将%-30.70C.%-5.20M:%-3.5L更改为%-60style{%-30.70C.%-5.20M:%-3.5L}即可。
简单说明一下,用%-60style{replace-your-pattern-here}把你想格式化的图案部分包起来,然后根据你的情况调整宽度值(这里是60个字符宽度),如果你想彩色输出,只要在style{pattern}后面加上省略的{ANSI style}即可。
下面是Log4j2文档:https://logging.apache.org/log4j/2.x/manual/layouts.html#Patterns

nqwrtyyt

nqwrtyyt2#

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

}

相关问题