Java logger slf4j example
The org.slf4j.Logger interface is the main user entry point of SLF4J API. It is expected that logging takes place through concrete implementations of this interface.
Typical usage pattern:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class Wombat < final static Logger logger = LoggerFactory.getLogger(Wombat.class); Integer t; Integer oldT; public void setTemperature(Integer temperature) < oldT = t; t = temperature; logger.debug("Temperature set to <>. Old temperature was <>.", t, oldT); if (temperature.intValue() > 50) < logger.info("Temperature has risen above 50 degrees."); > > >
Note that version 2.0 of the SLF4J API introduces a fluent api, the most significant API change to occur in the last 20 years. Be sure to read the FAQ entry relating to parameterized logging. Note that logging statements can be parameterized in presence of an exception/throwable. Once you are comfortable using loggers, i.e. instances of this interface, consider using MDC as well as Markers.
Field Summary
Method Summary
Make a new LoggingEventBuilder instance as appropriate for this logger and the desired Level passed as parameter.
This method is similar to debug(String, Object. ) method except that the marker data is also taken into consideration.
This method is similar to debug(String, Object) method except that the marker data is also taken into consideration.
This method is similar to debug(String, Object, Object) method except that the marker data is also taken into consideration.
This method is similar to debug(String, Throwable) method except that the marker data is also taken into consideration.
This method is similar to error(String, Object. ) method except that the marker data is also taken into consideration.
This method is similar to error(String, Object) method except that the marker data is also taken into consideration.
This method is similar to error(String, Object, Object) method except that the marker data is also taken into consideration.
This method is similar to error(String, Throwable) method except that the marker data is also taken into consideration.
This method is similar to info(String, Object. ) method except that the marker data is also taken into consideration.
This method is similar to info(String, Object) method except that the marker data is also taken into consideration.
This method is similar to info(String, Object, Object) method except that the marker data is also taken into consideration.
This method is similar to info(String, Throwable) method except that the marker data is also taken into consideration.
This method is similar to trace(String, Object. ) method except that the marker data is also taken into consideration.
This method is similar to trace(String, Object) method except that the marker data is also taken into consideration.
This method is similar to trace(String, Object, Object) method except that the marker data is also taken into consideration.
This method is similar to trace(String, Throwable) method except that the marker data is also taken into consideration.
This method is similar to warn(String, Object. ) method except that the marker data is also taken into consideration.
This method is similar to warn(String, Object) method except that the marker data is also taken into consideration.
This method is similar to warn(String, Object, Object) method except that the marker data is also taken into consideration.
This method is similar to warn(String, Throwable) method except that the marker data is also taken into consideration.
Field Detail
ROOT_LOGGER_NAME
Method Detail
getName
makeLoggingEventBuilder
default LoggingEventBuilder makeLoggingEventBuilder(Level level)
Make a new LoggingEventBuilder instance as appropriate for this logger implementation. This default implementation always returns a new instance of DefaultLoggingEventBuilder . Note that the LoggingEventBuilder should be built for all levels, independently of the level. In other words, this method is an unconditional constructor for the LoggingEventBuilder appropriate for this logger implementation.
atLevel
Make a new LoggingEventBuilder instance as appropriate for this logger and the desired Level passed as parameter. If this Logger is disabled for the given Level, then a NOPLoggingEventBuilder is returned.
isEnabledForLevel
isTraceEnabled
trace
trace
Log a message at the TRACE level according to the specified format and argument. This form avoids superfluous object creation when the logger is disabled for the TRACE level.
trace
void trace(String format, Object arg1, Object arg2)
Log a message at the TRACE level according to the specified format and arguments. This form avoids superfluous object creation when the logger is disabled for the TRACE level.
trace
void trace(String format, Object. arguments)
Log a message at the TRACE level according to the specified format and arguments. This form avoids superfluous string concatenation when the logger is disabled for the TRACE level. However, this variant incurs the hidden (and relatively small) cost of creating an Object[] before invoking the method, even if this logger is disabled for TRACE. The variants taking one and two arguments exist solely in order to avoid this hidden cost.
trace
isTraceEnabled
Логирование с Slf4j и Logback
Java существует уже много лет. В этом языке программирования огромное количество древнего наследия, особенностей и запутывающих новичков костылей. В первых версиях Java не было нормальной системы логирования, что привело к настоящему кошмару и порождению целого моря несовместимых друг с другом стандартов и библиотек, решающих одну и ту же задачу.
В прошлых статьях я описывал кучу различных библиотек логирования: System.err, JUL, Log4j 1.2, Apache Commons Logging, Log4j 2. В новых приложениях, как правило, ни один из них не используется. Сейчас правильным подходом считается использование API Slf4j и его реализации Logback.
Но что делать со всем старым кодом? Мы же не можем просто выбросить то огромное количество логеров и библиотек, которое уже существует. Для них нужно подключать специальные зависимости, содержащие их API, но вместо реализации перенаправляющие вывод в Slf4j:
- jcl-over-slf4j.jar содержит в себе API от Apache Commons Logging, но вместо его реализации просто перенаправляет все вызовы в Slf4j.
- log4j-over-slf4j.jar содержит в себе API от Log4j, но вместо его реализации перенаправляет все вызовы в Slf4j.
- jul-to-slf4j.jar содержит в себе обработчик (Handler) для JUL, который пишет все сообщения в Slf4j. Так как JUL встроен в JDK, то заменить его как в случае Apache Commons Logging и Log4j мы не можем, именно поэтому мы просто добавляем новый Handler.
Кроме вышеперечисленных зависимостей, перенаправляющих в Slf4j с API других библиотек, существуют зависимости, которые наоборот реализуют API Slf4j:
- slf4j-log4j12.jar перенаправляет вызовы Slf4j в Log4j12, то есть позволяет использовать Log4j 1.2 в качестве реализации API Slf4.
- slf4j-jdk14.jar перенаправляет вызовы Slf4j в JUL, то есть позволяет использовать JUL в качестве реализации API Slf4j.
- slf4j-nop.jar просто игнорирует все вызовы Slf4j, что равносильно полному отключению логов.
- slf4j-simple.jar перенаправляет вызовы Slf4j в System.err.
- slf4j-jcl.jar перенаправляет вызовы Slf4j в Apache Commons Logging, то есть позволяет использовать Apache Commons Logging в качестве реализации API Slf4j. Самое интересное в этом случае то, что Apache Commons Logging тоже является лишь обёрткой с API, перенаправляющей выводы в другие реализации…
- logback-classic.jar — это библиотека логирования, напрямую реализующая API Slf4j. В современных приложениях, как правило, используют именно её.
Надеюсь, я вас не запутал. Итак, что нам нужно сделать, чтобы использовать связку Slf4j и Logback:
- Подключить slf4j-api.
- Подключить logback-classic.
- Подключить jcl-over-slf4j, log4j-over-slf4j, чтобы сообщения логов от зависимостей, которые используют Apache Commons Logging и Log4j перенаправлялись в Slf4j. Можно ещё подключить jul-to-slf4j, но это не рекомендуется, так как от него сильно падает производительность.
- Из всех других подключаемых зависимостей убирать с помощью exclude в Maven зависимость от конкретной библиотеки логирования.
- Настроить Logback.
- Использовать slf4j-api для записи логов.
Давайте сделаем простое приложение с использованием Slf4j. Создайте новый проект Maven. Добавьте туда зависимость от Logback и Slf4j-api: