2008-12-08 2 views
14

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

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

+0

Другой случай использования, где можно было бы хотеть это когда вы запускает набор тестов, которые содержат отрицательные тесты, которые, как ожидается, будут генерировать исключения, которые мы всегда хотим регистрировать в процессе производства. Мы не хотим, чтобы наши тестовые журналы были заполнены исключениями, которые являются номинальными для курса. – 2015-08-06 22:14:35

ответ

14

Редактировать после прочтения некоторых более источника:

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

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

+1

Хорошо, это работает, спасибо. Жаль, что это не вариант конфигурации с log4j.Интересно, почему это обрабатывается так сильно, как другие параметры, доступные для PatternLayout. Кажется, что это естественный вариант форматирования ... – Thilo 2008-12-08 05:11:26

+1

Немного странно: когда я впервые посмотрел на код, я понял, что макеты обрабатывают все, а затем обнаружил, что на самом деле это приложение. И что приставки немного отличаются. Если вы собираетесь это сделать, вы можете добавить установщик для ignoreThroable() и отправить патч. – kdgregory 2008-12-08 12:22:38

1

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

0

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

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

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

Ta-dum!

2

Преобразование слова «nopex» или «nopexception» в logback-classic (преемник log4j) отключает трассировку стека стека. Преобразующее слово «nopex» документировано вместе с rest of conversion words. Вам нужно немного прокрутить список.

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

9

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

import org.apache.log4j.PatternLayout; 

public class NoStackTracePatterLayout extends PatternLayout { 

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

Спасибо. Опять же, нужно написать подкласс только для этого, это не приятно. Должна быть опция конфигурации на PatternLayout. – Thilo 2009-11-25 00:46:29

4

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

+0

Это было полезно для меня. Благодарю. – 2014-05-21 08:44:40

4

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

Пример (с log4j.properties файла), определить его как макет вашего Appender, а затем добавить %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} 
Смежные вопросы