Как настроить log4j для того, чтобы не печатать исключение stacktrace?

Мы используем Log4j (и Commons Logging) для регистрации наших сообщений об ошибках. Теперь мы хотим настроить дополнительный файл журнала, который выводит фатальные ошибки в syslog, но без исключительно длинных стеков Java (они все равно будут доступны в полном файле журнала).

Как бы настроить это (используя log4j.xml)? Есть ли доступный фильтр, чтобы игнорировать трассировки стека?

Ответы

Ответ 1

Изменить после чтения еще одного источника:

Вам все еще нужно подклассировать PatternLayout, но метод, который вы хотите переопределить, игнорируетсяThrowable(): он должен возвращать значение false, что предотвратит возможность написания приложения Throwable (предполагается, что макет уже сделал это).

Невозможно указать это в конфигурации: PatternLayout имеет жестко закодированное "return true".

Ответ 2

Вот фактический код, который я использую:

import org.apache.log4j.PatternLayout;

public class NoStackTracePatterLayout extends PatternLayout {

 @Override
 public boolean ignoresThrowable(){
  return false;
 }
}

Ответ 3

В 1.2.16 вы можете использовать EnhancedPatternLayout

Ответ 4

Если вы используете log4j > 1.2.16, вы можете использовать макет EnhancedPatternLayout.

Пример (с файлом log4j.properties), определите его как макет вашего приложения, а затем добавьте %throwable{0} в шаблон преобразования:

log4j.appender.XXX.layout=org.apache.log4j.EnhancedPatternLayout
log4j.appender.XXX.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c:%L - %m%n%throwable{0}

Ответ 5

Слово "nopex" или "nopexception" в logback-classic (преемник log4j) отключает трассировку стека стека. Слово конверсии "nopex" документировано вместе с остальными словами преобразования. Вам нужно немного прокрутить страницу.

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

Ответ 6

Возможно, вам понадобится написать собственный макет, чтобы сделать это (что не так уж плохо, вы можете подклассировать PatternLayout).

Ответ 7

Если вы можете изменить исходный код, тогда для рассмотрения будет доступен другой вариант.

В моих приложениях я всегда и только регистрирую сообщения FATAL из точки входа в мои приложения (например, "main()" ), так как я знаю только, что они фатальны, если я собираюсь выйти из приложения из-за них.

Следовательно, в этом одном месте (или несколько, если у вас есть несколько точек входа в приложение), создайте Log4j Logger со специальным классом или MDC из "syslog" или аналогичным. После того, как вы поймаете ошибку "Будущее-FATAL", зарегистрируйте ее обычным способом (для ваших других файлов журналов и т.д.), Но также вызовите метод fatal() в этом новом журнале регистрации "syslog" только с точным сообщением, которое вы (например, только класс исключения и сообщение, но без трассировки стека). Затем настройте Log4j, чтобы направить только этот класс "syslog" или MDC на вновь настроенный Appender, который нацелен на SysLog.

Ta-дум!