Статьи

Logback: уведомление об ошибках приложения

Несколько месяцев назад, когда я занимался рефакторингом больших приложений, я обнаружил действительно раздражающие фрагменты кода на основе log4j, которые использовались для регистрации, повторяемые сотни раз:

1
2
3
if (LOG.isDebugEnabled()) {
    LOG.debug("Logging some stuff = " + stuff);
}

Я хотел избавиться от isXXXEnabled и вот как я нашел Logback и SLF4J .  

Logback и SLF4J

Logback в сочетании с SLF4J обеспечивает отличный API и быструю и мощную реализацию каркаса журналирования. Причины, по которым переключиться на Logback с log4j не являются темой этого поста, и они уже подробно описаны на веб-сайте logback . Вкратце, что вы получаете с Logback и SL4FJ:

  • простой и быстрый способ пропустить isXXXEnabled с:
    1
    LOG.debug("Logging some stuff = {}", stuff);
  • автоматическая перезагрузка файлов конфигурации
  • мощные фильтры
  • загрузка файла свойств в конфигурационный XML
  • условная конфигурация

Благодаря инструменту миграции SLF4J миграция из log4j api в SLF4J происходит очень быстро. Я решил переключить все проекты на Logback, и через несколько месяцев я должен сказать, что я действительно доволен этим решением.

Чтобы использовать Logback в вашем проекте, добавьте следующие зависимости:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.6.4</version>
</dependency>
 
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.1</version>
</dependency>
 
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.6.4</version>
</dependency>

Настройка уведомлений об ошибках с Logback

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

Самым распространенным способом регистрации ошибок, конечно, является регистрация исключений с помощью трассировки стека в лог-файле, но если у вас есть несколько приложений на нескольких хостах, проверка ошибок может занять много времени. Более разумный способ — зарегистрировать их в базе данных — этого можно достичь с помощью DBAppender . Я нашел наиболее полезным, чтобы отправить все исключения на мою электронную почту, чтобы иметь возможность исправить их немедленно.

Чтобы настроить Logback для отправки писем с исключениями, нам нужно добавить зависимость Java Mail:

1
2
3
4
5
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4</version>
</dependency>

И определите конфигурацию для SMTPAppender в logback.xml:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- some application specific configuration here -->
 
    <appender name="sheriff" class="ch.qos.logback.classic.net.SMTPAppender">
  <smtpHost>localhost</SMTPHost>
  <from>[email protected]</From>
  <to>[email protected]</To>
  <subject>Something went wrong</Subject>
  <layout class="ch.qos.logback.classic.html.HTMLLayout"/>
 
  <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
   <level>ERROR</level>
  </filter>
 </appender>
 
    <root level="ERROR">
        <appender-ref ref="sheriff" />
    </root>
</configuration>

Благодаря ThresholdFilter с уровнем, установленным на ERROR, мы уверены, что даже если корневой уровень будет изменен, будут отправляться только сообщения об ошибках.

Теперь вы должны получить электронные письма, похожие на:

Пропуск уведомлений об ошибках в среде разработки

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

Чтобы использовать условные выражения, вам нужно добавить зависимость к Janino :

1
2
3
4
5
<dependency>
    <groupId>janino</groupId>
    <artifactId>janino</artifactId>
    <version>2.5.10</version>
</dependency>

Следующее, что нужно знать, какова ваша среда. В конфигурации Logback вы можете получить доступ к системным свойствам, свойствам logback или специальным переменным, таким как HOSTNAME и CONTEXT_NAME, и к ним, чтобы определить вашу среду. В моем приложении я использую профили Spring для этого, поэтому моя конфигурация ROOT logger:

1
2
3
4
5
<root level="ERROR">
    <if condition='"${spring.profiles.active}" == "production"'>
        <appender-ref ref="sheriff" />
    </if>
</root>

Несколько слов для пользователей log4j

Если вы решили придерживаться log4j, вы можете использовать его SMTPAppender .

Log4j может использоваться вместе с SLF4J благодаря библиотеке log4j-over-slf4j .  

Вывод

Отправка почты с помощью Logback — не единственный способ сообщить об ошибках. Можно использовать Jabber appender или даже написать appender, который будет отправлять ошибки через SMS-шлюз. Тебе решать.

Какие решения для уведомлений об ошибках вы используете в своих проектах?

Ссылка: Уведомление об ошибках приложения с Logback от нашего партнера по JCG Мачея Волковяка в блоге журнала « Разработка программного обеспечения» .