Форматирование 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