Как правильно инициализировать slf4j (используя log4j) logger в абстрактных классах / для наследования
в моем проекте у меня есть абстрактный класс верхнего уровня FrameProducer
. Я добавил регистратор slf4j на этом уровне, так что каждый наследующий класс уже имеет его. Вот код:
public abstract class FrameProducer extends Observable {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
protected BufferedImage frame;
public BufferedImage getFrame() {
return frame;
}
public void fireEvent() {
logger.debug("Firing event. Implementing class: {}", this.getClass());
setChanged();
notifyObservers();
}
}
есть также два наследующих класса:CameraFrameGrabber
и GrayscaleFilter
. Еще, когда метод fireEvent()
из CameraFrameGrabber
или GrayscaleFilter
сообщение регистрируется в
2 ответов
вход в абстрактные классы считается анти-шаблоном некоторыми, потому что он вводит потенциально неожиданную зависимость. Однако, если вы уверены, что все вещи, с которыми вы имеете дело, ваши собственные, что это не проблема, я думаю.
Если вы хотите получить сообщение журнала, чтобы показать конкретную реализацию, а не абстрактное имя класса (что имеет смысл), то измените оператор инициализации журнала в абстрактном классе на:
private final Logger logger = LoggerFactory.getLogger(getClass());
вместо что-то вроде:
private static final Logger logger = LoggerFactory.getLogger(MyAbstractClass.class);
то есть
- нет статики, потому что он может быть приведен к чему-то другому.
- getClass () вместо конкретного класса
Спасибо за указание правильного направления для поиска возможных исправлений skaffman. В конце концов я изменил свой log4j.properties
(как один из примеров в документация PatternLayout говорит):
log4j.rootCategory=TRACE, CONSOLE
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=DEBUG
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%-6r [%15.15t] %-5p %30.30c %x - %m%n
...и все регистрируется правильно.