Форматирование Log4j: можно ли усечь stacktraces?

Я хочу войти только первые несколько строк исключений в моей программе. Я знаю, я могу сделать что-то вроде этого, чтобы напечатать только первые 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 строк stacktrace?

5 ответов


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

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

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

для целей отслеживания, это билет это касалось ее осуществления: https://issues.apache.org/bugzilla/show_bug.cgi?id=48902


Юп... 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, как

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

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

java.ленг.Исключение: java.ленг.Исключение: Внутреннее Исключение

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


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

<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


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

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

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


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

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