首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用抽象类的Java日志记录

使用抽象类的Java日志记录
EN

Stack Overflow用户
提问于 2012-08-28 21:41:08
回答 6查看 40.2K关注 0票数 69

我正在做一个项目,目前正在用log4j实现一些日志记录,我很好奇我应该如何实现日志。我正在考虑的两个实现如下所示:

优先选项

对该类和所有子类使用超类中的单个日志:

代码语言:javascript
复制
public abstract class AbstractFoo {
    protected static Log LOG = LogFactory.getLog(AbstractFoo.class);

    ...
}

public class Foo extends AbstractFoo {
    public void someMethod() {
        LOG.info("Using abstract log");
    }
}

第二个选项

对每个类、超级类和子类使用单独的日志:

代码语言:javascript
复制
public abstract class AbstractFoo {
    private static Log LOG = LogFactory.getLog(AbstractFoo.class);

    ...
}

public class Foo extends AbstractFoo {
    private static Log LOG = LogFactory.getLog(Foo.class);        

    public void someMethod() {
        LOG.info("Using own log");
    }
}

什么更有意义?为什么?

EN

Stack Overflow用户

发布于 2020-03-21 03:56:57

在抽象类中使用Logger有两个原因(我能想到的):

在注销作为caller.

  • Unified日志记录或所有具体类中的通用日志记录的同时,在抽象类的方法中注销记录器的

  • 用法。

如果你更喜欢静态记录器(这也是我的首选),那么n1cr4m的答案很好地解决了#1和#2。

但是,如果您对#2更感兴趣,并且不喜欢每个具体类都需要实现getLogger()这一事实,那么您可以执行以下操作。作为示例,我将使用一个转换器:

代码语言:javascript
复制
public abstract class AbstractConverter{

   protected void logError(Logger logger, String someId, String msg){
       logger.error("Error during conversion of unit \""+ someId + "\": " + msg); 
   }

}

记录器可以是来自具体类的静态记录器。现在,每当您登录时,都将统一地打印前缀,这也会强制它转换的对象的标识。

这种解决方案的缺点是,如果AbstractConverter需要在其方法中使用记录器本身,它将无法使用来自具体类的记录器,除非您还将其设为一个参数,这是我强烈反对的。如果您需要这种功能,请使用n1cr4m的解决方案。

票数 0
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12160540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档