Оболочка регистрации - log4j - PullRequest
2 голосов
/ 06 июля 2010

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

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

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

Ответы [ 4 ]

3 голосов
/ 06 июля 2010

Я бы предложил использовать 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 ).

1 голос
/ 23 июля 2014

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

class YourLog4jWrapper {

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

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

}
1 голос
/ 07 июля 2010

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

public class Log4jWrapper implements ILogger

{private Logger logger;

/**
 * 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 );
    }
}
1 голос
/ 06 июля 2010

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

...