Как я могу настроить log4j, чтобы не печатать трассировку стека исключений? - PullRequest
17 голосов
/ 08 декабря 2008

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

Как можно настроить это (используя log4j.xml)? Доступен ли фильтр для игнорирования следов стека?

Ответы [ 8 ]

15 голосов
/ 08 декабря 2008

Редактировать после прочтения еще немного источника:

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

Нет способа указать это в конфигурации: PatternLayout имеет жестко закодированное «возвращать истину».

9 голосов
/ 24 ноября 2009

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

import org.apache.log4j.PatternLayout;

public class NoStackTracePatterLayout extends PatternLayout {

 @Override
 public boolean ignoresThrowable(){
  return false;
 }
}
6 голосов
/ 25 марта 2015

Если вы используете 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 голосов
/ 16 июня 2010

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

2 голосов
/ 29 мая 2009

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

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

1 голос
/ 24 апреля 2018

Начиная с Log4j2, вы можете просто добавить "%ex{0}" в шаблон журнала (при условии, что вы используете PatternLayout)

https://logging.apache.org/log4j/log4j-2.1/manual/layouts.html

1 голос
/ 08 декабря 2008

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

0 голосов
/ 08 декабря 2008

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

В моих приложениях я всегда и только регистрирую ФАТАЛЬНЫЕ сообщения от точки входа в мои приложения (например, "main ()"), поскольку я знаю, что они являются фатальными, если я собираюсь выйти из приложения из-за них. 1003 *

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

Ta-дум!

...