Форматирование в Log4j: возможно ли обрезать трассировки стека? - PullRequest
30 голосов
/ 16 июля 2010

Я хочу регистрировать только первые несколько строк Исключений в моей программе. Я знаю, что могу сделать что-то подобное, чтобы напечатать только первые 5 строк трассировки стека:

Throwable e = ...;
StackTraceElement[] stack = e.getStackTrace();
int maxLines = (stack.length > 4) ? 5 : stack.length;
for (int n = 0; n < maxLines; n++) {
    System.err.println(stack[n].toString());
}

Но я бы лучше использовал log4j (или slf4j над log4j, чтобы быть более точным) для регистрации. Есть ли способ сообщить log4j, что он должен печатать только первые 5 строк трассировки стека?

Ответы [ 5 ]

34 голосов
/ 16 июля 2010

Вы можете использовать EnhancedPatternLayout в log4j для форматирования ваших стековых трасс.

См. http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/EnhancedPatternLayout.html,, в частности, раздел о шаблоне «throwable» в таблице шаблонов.

Обратите внимание, что поддержка поддержки %throwable{n} является довольно новой и требует по крайней мере log4j1.2.16 (последний на момент написания)

Для целей отслеживания, это билет, который имел дело с его реализацией: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902

10 голосов
/ 16 июля 2010

Да ... EnhancedPatternLayout предоставляет эту функциональность. (Начиная с Log4J-1.2.16, раньше был в дополнительных компаньонах).

Для конфигурации log4j

<appender name="Console" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="debug"/>
    <layout class="org.apache.log4j.EnhancedPatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%t] %c.%M - %m%n %throwable{short}"/>
    </layout>
</appender>

и для части кода Java, например

бросить новое исключение (новый Исключение («Внутреннее исключение»));

Вы получаете следующее в файле журнала ...

java.lang.Exception: java.lang.Exception: Внутреннее исключение

Если мы удалим '% throwable {short}' из нашего файла конфигурации log4j, мы получим полную трассировку стека

3 голосов
/ 14 июля 2016

В log4j2.xml просто добавьте% throwable {short} в конце.Не нужно добавлять имя параметра.

<PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n %throwable{short} %n"/>

ref: https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout

1 голос
/ 16 июля 2010

Да, это часть log4j начиная с log4j 1.2.16

Вот оригинальное предложение в трекере проблем Apache, которое подробно описывает, как выглядит каждое из приложений шаблона% throwable: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902#c0

1 голос
/ 16 июля 2010

Я не знаю такой опции. Но вы можете расширить ваш текущий appender (например, RollingFileAppender) и предоставить метод append / doAppend / subAppend (в зависимости от того, какой класс вы расширяете) для обработки этого.

Информация о броске содержится в LoggingEvent.throwableInformation

Тем не менее, я не уверен, что вы должны это делать - вы можете потерять важную информацию таким образом.

...