Как вы сокращаете шаблонный код Java-журналирования? - PullRequest
15 голосов
/ 17 октября 2008

Каждый класс, который хочет использовать java.util.logging, обычно должен объявить регистратор следующим образом:

public class MyClass {
    private static Logger _log = Logger.getLogger(MyClass.class.getName());
}

Как избежать этого стандартного кода MyClass.class.getName ()?

Ответы [ 10 ]

12 голосов
/ 17 октября 2008

У меня есть шаблон, настроенный в Eclipse, так что мне нужно только набрать часть объявления, а затем Eclipse автоматически выполнит все остальные для меня.

${:import(org.apache.log4j.Logger)}
private final static Logger log = Logger.getLogger(${enclosing_type}.class);
${cursor}

Итак, мне нужно только набрать logger, нажать Ctrl+Space, затем Enter, и Eclipse заполняет все остальное для меня и добавляет объявление импорта.

Это не сократит количество стандартного кода, но, по крайней мере, сократит количество нажатий клавиш.

4 голосов
/ 17 октября 2008

Посмотрите, как использовать точечные сокращения в вашем коде

Я не оглядывался назад, так как использовал их с пружиной.

Вот статья об использовании AspectJ

http://www.developer.com/java/other/article.php/3109831

3 голосов
/ 12 марта 2009

На самом деле, обычная практика использования имен классов для имен регистраторов ленива больше всего.

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

3 голосов
/ 17 октября 2008

В зависимости от ваших потребностей в журнале, вы можете создать класс "LoggingService" со статическими методами для входа в различные "каналы". Я обнаружил, что мне действительно не нужно детализировать записи до уровня класса. Вы можете назвать свои регистраторы, что каждый работает лучше для вас. Мы использовали это в больших корпоративных приложениях в течение нескольких лет, и детализация действительно не была для нас проблемой.

Служба журналирования, инициализированная в статическом блоке инициализатора ... поэтому для регистрации сообщения:

LoggingService.logError ( "л");

Нет кода в каждом классе.

Вот пример службы регистрации:

public class LoggingService {

/**
 * A log for informational messages.
 */
static private Logger infoLog;

/**
 * A log for data access messages.
 */
static private Logger dataAccessLog;

/**
 * A log for debug messages.
 */
static private Logger debugLog;

/**
 * A log for error messages.
 */
static private Logger errorLog;

/**
 * A log for all XML related messages.
 */
static private Logger xmlLog;

/**
 * A log for all trace messages.
 */
static private Logger traceLog;

/**
 * A log for all warning messages.
 */
static private Logger warnLog;

static {

    //This is the bootstrap for the logging service.
    //Setup each logger
    infoLog = Logger.getLogger("com.company.logging.info");
    dataAccessLog = Logger.getLogger("com.company.logging.dataaccess");
    debugLog = Logger.getLogger("com.company.logging.debug");
    errorLog = Logger.getLogger("com.company.logging.error");
    xmlLog = Logger.getLogger("com.company.logging.xml");
    traceLog = Logger.getLogger("com.company.logging.trace");
    warnLog = Logger.getLogger("com.company.logging.warn");

    // This must be set so isErrorEnabled() will work.
    errorLog.setLevel(Level.ERROR);
    warnLog.setLevel(Level.WARN);
}
static public void logDataAccess(String pMessage) {
    dataAccessLog.info(pMessage);
}

static public void logInfo(String pMessage) {
    infoLog.info(pMessage);
}

static public void logDebug(String pMessage) {
    debugLog.debug(pMessage);
}

static public void logTrace(String pMessage) {
    traceLog.debug(pMessage);
}

static public void logWarn(String pMessage) {
    warnLog.warn(pMessage);
}

static public void logError(String pMessage) {
    errorLog.error(pMessage);
}

static public void logError(String pMessage, Throwable pThrowable) {
    errorLog.error(pMessage, pThrowable);
}

static public void logXml(String pMessage, XmlBean pContainer) {

    if (!xmlLog.isInfoEnabled()) return;

    xmlLog.info(pMessage + " : " + JAXBHelper.marshal(pContainer));
}

static public boolean isInfoEnabled() {
    return infoLog.isInfoEnabled();
}

static public boolean isDataAccessEnabled() {
    return dataAccessLog.isInfoEnabled();
}

static public boolean isDebugEnabled() {
    return debugLog.isDebugEnabled();
}

static public boolean isErrorEnabled() {
    if (errorLog.getLevel().toInt() >= Level.ERROR_INT) {
        return true;
    }
    return false;
}

static public boolean isTraceEnabled() {
    return traceLog.isDebugEnabled();
}

static public boolean isXmlEnabled() {
    return xmlLog.isInfoEnabled();
}

static public boolean isWarnEnabled() {
    return warnLog.isEnabledFor(Level.WARN);
}

}

2 голосов
/ 17 октября 2008

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

private static final Logger log = Logs.log;

Существуют хаки для чтения имени класса вызывающей стороны (на самом деле реализация логирования имеет хак для обнаружения текущего метода), но я бы не рекомендовал это.

2 голосов
/ 17 октября 2008

Вам не нужен getName (), если вы используете версию log4j 1.2+, getLogger () принимает аргумент Class. Но в остальном нет никакого способа обойти это, если вы хотите, чтобы у каждого класса был статический член журнала со своей собственной категорией.

1 голос
/ 26 мая 2014

Вы можете уменьшить этот и многие другие стандартные коды с помощью lombok

https://github.com/rzwitserloot/lombok

 @Slf4j
     public class LogExample {
 }

будет

 public class LogExample {
     private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
 }
0 голосов
/ 18 октября 2008

Взгляните на SLF4J

0 голосов
/ 17 октября 2008

Если вы сделаете регистратор нестатическим, вы можете по крайней мере унаследовать его:

public class SomeBaseClass
{
    protected Logger logger = Logger.getLogger(getClass());
}

public class SubClass extends SomeBaseClass
{
    public void doit() { logger.debug("doit!!!!"); }
}

Так я всегда делал.

0 голосов
/ 17 октября 2008

Вы можете немного сократить это, так как getLogger перегружен, чтобы просто взять класс. Вот так:

public class MyClass {
    private static Logger _log = Logger.getLogger(MyClass.class);
}

Регистратор может быть настолько быстрым или негибким, насколько вы хотите. Вы можете получить новый регистратор для каждого класса, как в приведенном выше примере, и иметь иерархию регистраторов, где вы можете контролировать и включать / выключать регистрацию по классам. Или, если ваш проект небольшой или прототип и т. Д., Вы можете просто вызвать Logger.getRootLogger () - но вы потеряете гибкость в точной настройке того, что вы регистрируете, и не регистрируетесь. У вас может быть базовый класс, в котором живет регистратор, и пусть все так его называют, но опять же вы теряете некоторую гибкость:

public class MyBase {
     protected static Logger _log = Logger.getLogger(MyClass.class);
}

public class MyClass extends MyBase {
    ....
    _log.info("Stuff....");
}

Суть в том, что если вы хотите сохранить возможность более точной настройки ведения журнала позже в проекте (включить более точную отладку уровня только для одного класса), то вам, возможно, придется придерживаться эталонного шаблона в каждом классе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...