【问题标题】:How to initialize slf4j (using log4j) logger properly in abstract classes / for inheritance如何在抽象类/继承中正确初始化 slf4j(使用 log4j)记录器
【发布时间】:2010-10-12 11:26:26
【问题描述】:

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

还有两个继承类:CameraFrameGrabberGrayscaleFilter。然而,当从CameraFrameGrabberGrayscaleFilter 调用方法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.propertieslog4j.xml 文件是什么样的?

标签: log4j slf4j


【解决方案1】:

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

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

private final Logger logger = LoggerFactory.getLogger(getClass());

而不是类似的东西:

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

  • 没有静态,因为它可以转换为其他东西。
  • getClass() 代替特定的类

【讨论】:

    【解决方案2】:

    感谢您指出正确的方向以寻找可能的更正 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 2023-03-25
      • 1970-01-01
      • 2012-04-17
      相关资源
      最近更新 更多