Обертка журналирования - log4j

У меня есть требование создать интерфейс-оболочку, чтобы вы могли переключаться между различными механизмами ведения журнала без изменения кода. Итак, у меня есть собственный метод info (String message) внутри класса Wrapper, например:

публичная недействительная информация (объектное сообщение) {if (isInfoEnabled ()) {logger.info (сообщение); }}

Он работает так, как ожидалось, за исключением того, что при регистрации он показывает не класс и строку, откуда я веду журнал, а те, которые принадлежат классу Wrapper. Не могли бы вы помочь ...


person mariu    schedule 06.07.2010    source источник


Ответы (4)


Я предлагаю использовать Simple Logging Facade для Java (SLF4J) вместо вашей собственной оболочки. Со своего веб-сайта:

Фасад простого ведения журнала для Java или (SLF4J) служит простым фасадом или абстракцией для различных фреймворков ведения журнала, например java.util.logging, log4j и logback, что позволяет конечному пользователю подключить желаемую структуру ведения журнала во время развертывания.

Это модернизированная и предпочтительная 1 альтернатива Jakarta Commons Logging (JCL). Рекомендую прочитать в этой статье для подробного анализа, но вкратце сказано, что SLF4J не страдает от проблем с загрузчиком классов или утечек памяти, наблюдаемых с JCL. Сам автор Commons Logging признает это.

Если вам интересно, SLF4J был написан Ceki Gülcü, который является автором Log4J (и теперь работает над Logback, преемником Log4J). Итак, этот парень кое-что знает о ведении журнала, и есть некоторые шансы, что «его» обертка лучше моей.

Другими словами, ИМХО просто нет смысла создавать обертку в 2010 году, когда уже есть хорошая и хорошая.

1 Пожалуйста, не используйте Spring в качестве примера счетчика, Spring - пример плохого счетчика (см. SPR-5327).

person Pascal Thivent    schedule 06.07.2010
comment
Спасибо за ваши ответы. Хотя я очень хорошо понимаю вашу точку зрения, мои требования очень специфичны, и у меня должен быть собственный регистратор - это не совсем производственное приложение. Итак, не мог бы кто-нибудь ответить конкретно на мой вопрос. Спасибо. - person mariu; 06.07.2010

Уже существует интерфейс оболочки для различных реализаций журналирования: Apache Commons Logging. Вы пробовали использовать это вместо этого?

person Jon Skeet    schedule 06.07.2010

Итак, чтобы решить мое конкретное требование, вот что нужно сделать ...

public class Log4jWrapper implements ILogger

{личный регистратор;

/**
 * The name of this wrapper class
 */
static final String FQCN = Log4jWrapper.class.getName();

/**
 * Constructor which returns the root content
 */
public Log4jWrapper()
{
    logger = Logger.getRootLogger();
}

/**
 * Creates a {@link Logger} object
 * 
 * @param clazz name reference for this category to create
 */
public Log4jWrapper( Class<?> clazz )
{
    logger = Logger.getLogger( clazz );
}

/**
 * Log an debug message
 * 
 * @param msg the message
 */
public void debug( Object msg )
{
    if ( isDebugEnabled() )
    {
        logger.log( FQCN, Level.DEBUG, msg, null );
    }
}
person mariu    schedule 07.07.2010

Вот как вы оборачиваете log4j. Вы передаете log() имя вашего класса-оболочки.

class YourLog4jWrapper {

  Logger _base = Logger.getLogger(/*....*/);

  private void log(Object msg) {
    _base.log(YourLog4jWrapper.class.getName(), Priority.INFO, msg, null);
  }

}
person jake256    schedule 23.07.2014