Введение в SLF4J

Введение в SLF4J

1. обзор

Simple Logging Facade для Java (сокращенно SLF4J) - действует какfacade для различных фреймворков журналирования (например, java.util.logging, logback, Log4j). Он предлагает общий API, делающий ведение журнала независимым от фактической реализации.

Это позволяет сосуществовать различным структурам регистрации. Это также помогает переходить с одного фреймворка на другой. Наконец, кроме стандартизированного API, он также предлагает «синтаксический сахар».

В этой статье будут обсуждаться зависимости и конфигурация, необходимые для интеграции SLF4J с Log4j2, Logback, Log4J2 и Jakarta Commons Logging. Подробнее о каждой из этих реализаций вы можете прочитать в статьеIntroduction to Java Logging.

2. Настройка Log4j2

Чтобы использовать SLF4J с Log4j2, вы должны добавить следующие библиотеки вpom.xml:


    org.apache.logging.log4j
    log4j-api
    2.7


    org.apache.logging.log4j
    log4j-core
    2.7


    org.apache.logging.log4j
    log4j-slf4j-impl
    2.7

Последнюю версию можно найти здесь:log4j-api,log4j-core,log4j-slf4j-impl.

Фактическая конфигурация регистрации соответствует исходной конфигурации Log4j 2. Посмотрим, как создается экземплярLogger:

public class SLF4JExample {

    private static Logger logger = LoggerFactory.getLogger(SLF4JExample.class);

    public static void main(String[] args) {
        logger.debug("Debug log message");
        logger.info("Info log message");
        logger.error("Error log message");
    }
}

Обратите внимание, чтоLogger иLoggerFactory принадлежат пакетуorg.slf4j. Пример проекта, работающего с объясненной конфигурацией, доступенhere.

3. Настройка входа в систему

Чтобы использовать SLF4J с Logback, вам не нужно добавлять SLF4J в путь к классам. Logback уже использует SLF4J. Это считается эталонной реализацией. Нам нужно только включить библиотеку Logback:


    ch.qos.logback
    logback-classic
    1.1.7

Последнюю версию можно найти здесь:logback-classic.

Конфигурация зависит от Logback, но работает без проблем с SLF4J. При наличии надлежащих зависимостей и конфигурации тот же код из предыдущих разделов может быть использован для обработки журналирования.

4.The Log4j Setup

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

Существуют случаи, когда существующее решение для ведения журнала не может быть заменено, например, из-за сторонних требований. Это, однако, не означает, что проект «приговорен» только к уже используемой структуре.

SLF4J может быть настроен как мост, на который перенаправляются вызовы существующей платформы. Давайте добавим необходимые зависимости для создания моста для Log4j:


    org.slf4j
    log4j-over-slf4j
    1.7.21

При наличии зависимости (проверьте последнюю дату вlog4j-over-slf4j) все вызовы Log4j будут перенаправлены на SLF4J. Рассмотримofficial documentation, чтобы узнать больше о соединении существующих фреймворков.

Как и в случае с другими платформами, Log4j может служить базовой реализацией. Добавим необходимые зависимости:


    org.slf4j
    slf4j-log4j12
    1.7.21


    log4j
    log4j
    1.2.17

Последнюю версию можно найти здесь дляslf4j-log4j12 иlog4j. Примерный проект, сконфигурированный описанным образом, доступенhere.

5. Настройка моста JCL

В предыдущих разделах мы показали, как одна и та же база кода может использоваться для поддержки ведения журнала с использованием различных реализаций. Хотя это главное обещание и сила SLF4J, оно также является целью JCL (регистрация в Jakarta Commons или регистрация в Apache Commons).

JCL, по своим намерениям, является каркасом, похожим на SLF4J. Основное отличие состоит в том, что JCL разрешает базовую реализацию во время выполнения через систему загрузки классов. Такой подход воспринимается проблематичным в тех случаях, когда в игру входят пользовательские загрузчики классов.

SLF4J разрешает свои привязки во время компиляции. Он кажется более простым, но достаточно мощным.

К счастью, две платформы могут работать вместе в режиме моста:


    org.slf4j
    jcl-over-slf4j
    1.7.21

Последнюю версию зависимости можно найти здесьjcl-over-slf4j.

Как и в других случаях, та же база кода будет работать нормально. Пример полного проекта, в котором выполняется эта установка, доступенhere.

6. ДалееSLF4J Goodness

SLF4J предоставляет дополнительные возможности, которые могут сделать ведение журнала более эффективным и сделать код более читабельным. Например, SLF4J предоставляет очень полезный интерфейс для работы с параметрами:

String variable = "Hello John";
logger.debug("Printing variable value: {}", variable);

Вот пример кода Log4j, который делает то же самое:

String variable = "Hello John";
logger.debug("Printing variable value: " + variable);

Как видите, Log4j объединитStrings независимо от того, включен ли уровеньdebug или нет. В приложениях с высокой нагрузкой это может вызвать проблемы с производительностью. SLF4J будет объединятьStrings, только если включен уровеньdebug. Чтобы сделать то же самое с Log4J, вам нужно добавить дополнительный блокif, который будет проверять, включен ли уровеньdebug или нет:

String variable = "Hello John";
if (logger.isDebugEnabled()) {
    logger.debug("Printing variable value: " + variable);
}

SLF4J стандартизировал уровни ведения журнала, которые различны для конкретных реализаций. Уровень ведения журналаFATAL был понижен (он был введен в Log4j) на основании предпосылки, что в структуре ведения журнала мы не должны решать, когда приложение должно быть завершено.

Используемые уровни ведения журнала:ERROR, WARN, INFO, DEBUG, TRACE. Вы можете узнать больше об их использовании в статьеIntroduction to Java Logging.

7. Заключение

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

Как обычно, код можно найтиover on GitHub.. Кроме того, мы ссылаемся на два других проекта, посвященных другим статьям, но содержащих обсуждаемые конфигурации журналов,here иhere.