我正在做一个项目,目前正在用log4j实现一些日志记录,我很好奇我应该如何实现日志。我正在考虑的两个实现如下所示:
优先选项
对该类和所有子类使用超类中的单个日志:
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");
}
}第二个选项
对每个类、超级类和子类使用单独的日志:
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");
}
}什么更有意义?为什么?
发布于 2020-03-21 03:56:57
在抽象类中使用Logger有两个原因(我能想到的):
在注销作为caller.
如果你更喜欢静态记录器(这也是我的首选),那么n1cr4m的答案很好地解决了#1和#2。
但是,如果您对#2更感兴趣,并且不喜欢每个具体类都需要实现getLogger()这一事实,那么您可以执行以下操作。作为示例,我将使用一个转换器:
public abstract class AbstractConverter{
protected void logError(Logger logger, String someId, String msg){
logger.error("Error during conversion of unit \""+ someId + "\": " + msg);
}
}记录器可以是来自具体类的静态记录器。现在,每当您登录时,都将统一地打印前缀,这也会强制它转换的对象的标识。
这种解决方案的缺点是,如果AbstractConverter需要在其方法中使用记录器本身,它将无法使用来自具体类的记录器,除非您还将其设为一个参数,这是我强烈反对的。如果您需要这种功能,请使用n1cr4m的解决方案。
https://stackoverflow.com/questions/12160540
复制相似问题