2009-10-08 8 views
4

Могу ли я узнать, какая наилучшая практика использования org.apache.commons.logging.LogFactory.getLog?Лучшая практика использования org.apache.commons.logging.LogFactory.getLog

Для меня, я использую его следующим образом:

public class A 
{ 
    private static final Log log = LogFactory.getLog(A.class); 
} 

public class B 
{ 
    private static final Log log = LogFactory.getLog(B.class); 
} 

Так что, если у меня есть 100 классов, 100 статического объекта журнала будет создан?

Или это лучше сделать так?

public class A 
{ 
    private static final Log log = LogFactory.getLog(Main.class); 
} 

public class B 
{ 
    private static final Log log = LogFactory.getLog(Main.class); 
} 

Все 100 классов относятся к одному и тому же журналу?

спасибо.

ответ

3

Первый вариант - имеет регистратор для каждого класса (или функциональности). Поскольку большинство систем протоколирования - log4j, logback, java util logging и т. Д. Имеют понятие иерархии журналов, вы можете сопоставить это с вашей иерархией пакетов и иметь более тонкий контроль над тем, какие функции вы хотите зарегистрировать на каком уровне. Например:

com.example=WARN  # global setting 
com.example.web=INFO # increase logging for the web controllers 
com.example.dao=DEBUG # trying to track bugs in the database layer 
2

В подавляющем большинстве случаев ваш путь - путь.

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

log4j.logger.org.springframework.transaction=DEBUG 

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

4

Пожалуйста, помните «статическую проблему», которую игнорирует большинство разработчиков Java и которые влияют на log4j, java.util.Logger и SLF4J. Вы можете прочитать об этом в Apache Commons Wiki. Как сообщалось, если вы разрабатываете библиотеку, планируя ее выпустить в контейнере (например, в контейнере j2ee), который используется во многих приложениях, лучше использовать что-то вроде

private transient final Log logger = LogFactory.getLog(this.getClass());