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

mmm*_*mmm 8 log4j slf4j

在我的项目中,我有一个顶级的抽象类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();
    }
}
Run Code Online (Sandbox Code Playgroud)

还有两个继承类:CameraFrameGrabberGrayscaleFilter.然而,当从该方法fireEvent()调用该方法CameraFrameGrabberGrayscaleFilter在该FrameProducer级别记录该消息时.这里是日志,为清楚起见:

FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.CameraFrameGrabber
FrameProducer.fireEvent - Firing event. Implementing class: class com.ofj.frameaccess.GrayscaleFilter
Run Code Online (Sandbox Code Playgroud)

是否可以以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
Run Code Online (Sandbox Code Playgroud)

Mar*_*k D 8

登录抽象类被一些人视为反模式,因为它引入了潜在的意外依赖.但是,如果你确定你所处理的所有东西都是你自己的,那我认为没问题.

如果要获取日志消息以显示具体实现而不是抽象类名(这是有意义的),那么将抽象类中的日志记录初始化语句更改为:

private final Logger logger = LoggerFactory.getLogger(getClass());
Run Code Online (Sandbox Code Playgroud)

而不是像:

private static final Logger logger = LoggerFactory.getLogger(MyAbstractClass.class);
Run Code Online (Sandbox Code Playgroud)

  • 没有静态,因为它可以被投射到其他东西.
  • getClass()而不是特定的类


mmm*_*mmm 1

感谢斯卡夫曼指出了寻找可能更正的正确方向。我最终将其更改为(正如PatternLayout 文档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=%-6r [%15.15t] %-5p %30.30c %x - %m%n
Run Code Online (Sandbox Code Playgroud)

...一切都被正确记录。