在我的项目中,我有一个顶级抽象类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
时,正在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
答案 0 :(得分:8)
登录抽象类被一些人视为反模式,因为它引入了潜在的意外依赖。但是,如果你确定你所处理的所有东西都属于你自己,那我认为没问题。
如果要获取日志消息以显示具体实现而不是抽象类名(这是有意义的),那么将抽象类中的日志记录初始化语句更改为:
private final Logger logger = LoggerFactory.getLogger(getClass());
而不是像:
private static final Logger logger = LoggerFactory.getLogger(MyAbstractClass.class);
即
答案 1 :(得分:0)
感谢您指出正确的方向寻找可能的修正skaffman。我最终将log4j.properties
更改为(PatternLayout documentation中的一个示例):
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
......一切都记录正确。