Статьи

Как настроить SLF4J с различными реализациями регистратора

slf4j библиотеки slf4j качестве уровня API ведения журнала приложений Java дает много преимуществ. Здесь я покажу несколько примеров того, как использовать и настраивать различные регистраторы.

Вы можете думать о slf4j как о Java-интерфейсе, и тогда вам потребуется реализация (ТОЛЬКО ОДИН) во время выполнения, чтобы предоставить фактические подробности регистрации, такие как запись в STDOUT или в файл и т. Д. Каждая реализация регистрации (или называемая привязка) будет очевидно, у них есть свой собственный способ настройки вывода журнала, но ваше приложение останется независимым и всегда будет использовать тот же API org.slf4j.Logger . Посмотрим, как это работает на практике.

Использование slf4j с Simple logger

Создайте проект на основе Maven, и это в вашем pom.xml .

1
2
3
4
5
<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.5</version>
    </dependency>

Теперь вы можете использовать Logger в своем Java-коде следующим образом.

01
02
03
04
05
06
07
08
09
10
11
12
package deng;
import org.slf4j.*;
public class Hello {
    static Logger LOGGER = LoggerFactory.getLogger(Hello.class);
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++)
            if (i % 2 == 0)
                LOGGER.info("Hello {}", i);
            else
                LOGGER.debug("I am on index {}", i);
    }
}

Выше будет скомпилирована ваша программа, но когда вы запустите ее, вы увидите эти результаты.

1
2
3
4
bash> java deng.Hello
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

Это говорит о том, что во время выполнения вы пропускаете «реализацию» ведения журнала (или привязку средства ведения журнала), поэтому slf4j просто использует slf4j «NOP», которая ничего не делает. Чтобы правильно увидеть вывод, вы можете попробовать использовать простую реализацию, которая вообще не требует никакой настройки! Просто вернитесь к вашему pom.xml и добавьте следующее:

1
2
3
4
5
<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>1.7.5</version>
    </dependency>

Теперь вы видите запись журнала на STDOUT с уровнем INFO. Этот простой регистратор по умолчанию покажет любое сообщение уровня INFO или выше. Чтобы увидеть сообщения DEBUG, вам нужно передать это системное свойство -Dorg.slf4j.simpleLogger.defaultLogLevel=DEBUG при запуске Java.

Использование slf4j с Log4j logger

Теперь мы можем поэкспериментировать и поменять местами разные реализации логгера, но код вашего приложения может остаться прежним. Все, что нам нужно, это не заменить slf4j-simple другой популярной реализацией логгера, такой как Log4j.

1
2
3
4
5
<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.5</version>
    </dependency>

Опять же, мы должны настроить ведение журнала для каждой выбранной реализации. В этом случае нам нужен файл src/main/resources/log4j.properties .

1
2
3
4
5
log4j.rootLogger=DEBUG, STDOUT
    log4j.logger.deng=INFO
    log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
    log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
    log4j.appender.STDOUT.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

Перезапустите вашу программу, и вы должны увидеть аналогичные результаты.

Использование slf4j с JDK logger

JDK на самом деле поставляется с пакетом logger, и вы можете заменить pom.xml этой реализацией logger.

1
2
3
4
5
<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-jdk14</artifactId>
        <version>1.7.5</version>
    </dependency>

Теперь с конфигурацией для ведения журнала JDK немного сложно работать. Не только нужен файл конфигурации, такой как src/main/resources/logging.properties , но также необходимо добавить системные свойства -Djava.util.logging.config.file=logging.properties , чтобы он мог его выбрать. вверх. Вот пример для начала:

Уровень = INFO

1
2
3
handlers=java.util.logging.ConsoleHandler
java.util.logging.ConsoleHandler.level=FINEST
deng.level=FINEST

Использование slf4j с Logback Logger

Реализация logback logger является реализацией супер дупа качества. Если вы намереваетесь написать серьезный код, который будет запущен в производство, вы можете оценить эту опцию. Снова измените ваш pom.xml чтобы заменить на это:

1
2
3
4
5
<dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.13</version>
    </dependency>

Вот пример конфигурации src/main/resources/logback.xml для начала работы.

1
2
3
4
5
6
<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>
1
<logger name="deng" level="DEBUG"/>
1
2
3
4
<root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

Написание собственной библиотеки с slf4j регистратора slf4j

Если вы предоставляете библиотеку Java для большого потребления конечными пользователями, slf4j-api установить для вашего проекта зависимость только от slf4j-api , а затем позволить своему пользователю выбрать любую реализацию средства slf4j-api журнала в своей среде разработки или среде выполнения. Как конечные пользователи, они могут быстро выбрать один из указанных выше вариантов и воспользоваться своими любимыми функциями реализации ведения журналов.

Ресурсы