Наверное каждый из вас знаком с commons-logging. Однако пользы от него не так много. Наличие трюков с class-loader-ами, а также излишнее использование reflection-а и отсутствие возможности использования параметризированных сообщений, мягко говоря огорчают.
Довольно популярной заменой commons-logging является Slf4j (Simple Logging Framework for Java). Во-первых, в нем реализована поддержка MDC (пока что такая возможность реализована в logback и log4j). Этот механизм удобно использовать, когда у вас в контексте одного потока в лог записывается много параметра, которые действительны только для данного контекста. Например, для каждого сообщения необходимо выводить также имя пользователя, его логин и т.д. Вместо того чтобы указывать эти параметры каждый раз в сообщении. Можно положить их в MDC-контекст:
MDC.put("ipAddress", request.getRemoteAddr());
Principal user = request.getUserPrincipal();
MDC.put("user", user.getName());
И указать в ConversionPattern
log4j эти параметры:
%X{ipAddress} - %X{user} %n%m
Во-вторых, есть наличие параметризованных сообщений. То есть, если раньше надо было писать так:
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
Если у нас будет не debug уровень, то будет тратиться время на сборку строки, которая не будет выводиться. Потому надо будет написать так:
if(logger.isDebugEnabled()) {
logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
Используя Slf4j все это можно заменить одной строкой:
logger.debug("Value {} was inserted between {} and {}.",
new Object[] {newVal, below, above});
Символами {}
как раз и обозначаются параметры строки, которые передаются последним аргументом. При этом сборка строки не будет производиться при уровне ниже чем debug.
В-третьих, сама архитектура представляет собой два модуля, api slf4j-api.jar
и реализация slf4j-XXXXX.jar
. Реализация представлена 6-ью модулями:
На главной странице этого проекта перечислены проекты, которые используют данный фреймворк и их число растет.
Пример использования:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
class TestClass {
private final Logger log = LoggerFactory.getLogger( TestClass.class );
...
log.debug( "..." );
}
1 комментарий:
Отличная библиотека!
Тоже всячески рекомендую всем использовать.
Год назад написал про неё следующее:
http://magicprinc.livejournal.com/902.html
Отправить комментарий