log4j устанавливает общую длину класса и метода в шаблоне - PullRequest
0 голосов
/ 13 мая 2018

В настоящее время у меня есть что-то вроде:

% d {ЧЧ: мм: ss.SSS} |% -5,5p |% -15,15 т |% -30,70C.% - 5,20M:% - 3,5L |% msg% n

но это делает full.class.Name.method: строку различной длины - возможно ли сделать calss.method: линию фиксированной длины?

Я хотел бы sthкак

% - 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 голосов
/ 08 июня 2018

Основано на помощи @ 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());
        }
    }

}

...