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

标签 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();
    }
}

还有两个继承类:CameraFrameGrabberGrayscaleFilter。然而,当从 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

最佳答案

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

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

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

而不是类似:

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

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

关于log4j - 如何在抽象类/继承中正确初始化 slf4j(使用 log4j)记录器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3914124/

相关文章:

apache-spark - spark执行程序中的自定义log4j附加程序

java - 如何提高Java代码调用Web服务并记录整个过程的速度?

java.lang.ClassCastException : org. slf4j.helpers.NOPLogger 无法转换为 org.slf4j.spi.LocationAwareLogger

java - 从远程电脑获取系统时间

java - 如何找到 log4j 默认初始化中使用的 URL?

apache-spark - 从谷歌云中的 spark worker 获取日志输出

logging - 如何设置中央日志服务器并将日志事件与测试和生产分开?

java - SSS 在 org.apache.log4j.helpers.ISO8601DateFormat 中代表什么?

java - 在 Eclipse Maven 项目中使用 sl4j 配置 Logback

java - 使用 mvn exec :java 时忽略 log4j.properties