2010-07-06 10 views
2

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

общественной ничтожной информации (сообщений Object) { если (isInfoEnabled()) { logger.info (сообщение); } }

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

ответ

0

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

4

Мое предложение было бы использовать Simple Logging Facade for Java (SLF4J) вместо вашей собственной обертки. На своем веб-сайте:

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

Это Moderner и предпочтительный альтернативой Jakarta Commons Logging (JCL). Я рекомендую прочитать подробный анализ this article, но короткая версия заключается в том, что SLF4J не страдает от проблем загрузчика классов или утечек памяти, наблюдаемых с JCL. Автор журнала Commons Logging admits it.

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

Другими словами, IMHO просто не имеет смысла создавать упаковку в 2010 году, когда хороший и хороший уже существует.

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

+0

Благодарим за ответы. Хотя я очень хорошо понимаю вашу точку зрения, мое требование очень специфично, и у меня должен быть свой собственный регистратор - это не действительно производственное приложение. Так, может кто-то пожалуйста, ответьте конкретно на мой вопрос. Спасибо. – mariu

1

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

public class Log4jWrapper implements ILogger 

{ частного 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

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

class YourLog4jWrapper { 

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

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

} 
Смежные вопросы