Подтвердить что ты не робот

Форматирование Log4j: возможно ли обрезать стопку стеков?

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

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 строк stacktrace?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Yup... 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, например

throw new Exception (новый Исключение ( "Внутреннее исключение" ));

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

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

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

Ответ 4

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

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

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

Ответ 5

Да, это часть log4j, так как log4j 1.2.16

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