如何在抽象类中正确初始化slf4j(使用log4j)记录器/用于继承

如何在抽象类中正确初始化slf4j(使用log4j)记录器/用于继承,log4j,slf4j,Log4j,Slf4j,在我的项目中,我有一个顶级抽象类FrameProducer。我在这个级别添加了一个slf4j记录器,这样每个继承类都已经有了它。代码如下: public abstract class FrameProducer extends Observable { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); protected BufferedImage frame; pub

在我的项目中,我有一个顶级抽象类
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
。但是,当从
CameraFrameGrabber
GrayscaleFilter
调用方法
fireEvent()
时,消息将记录在
FrameProducer
级别。为清楚起见,此处显示日志:

FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.CameraFrameGrabber
FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.GrayscaleFilter
是否可以在
FrameProducer
中初始化记录器,使所有内容都以我的类层次结构中最专门的级别记录?

谢谢你的帮助


编辑:我的log4j.properties如下所示:

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=%C{1}.%M - %m%n

感谢你指出了正确的方向,寻找可能的修正斯卡夫曼。我最终将我的
log4j.properties
更改为(如本文中的一个示例所示):


…而且所有内容都被正确记录。

在抽象类中记录被一些人认为是一种反模式,因为它引入了潜在的意外依赖。然而,如果你确信你处理的所有事情都是你自己的,我想那没问题

如果希望让日志消息显示具体实现而不是抽象类名(这很有意义),请将抽象类中的日志初始化语句更改为:

private final Logger logger = LoggerFactory.getLogger(getClass());
而不是像:

private static final Logger logger = LoggerFactory.getLogger(MyAbstractClass.class);
i、 e

  • 没有静态,因为它可以转换为其他内容
  • getClass()而不是特定的类

默认情况下应该这样做。您的
log4j.properties
log4j.xml
文件是什么样子的?
private static final Logger logger = LoggerFactory.getLogger(MyAbstractClass.class);