如何在抽象类中正确初始化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);