Как правильно инициализировать 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

...и все регистрируется правильно.