Javalogging与抽象类

我正在开发一个项目,目前正在使用log4j来实现一些日志logging,我对如何执行日志感到好奇。 我踢的两个实现如下:

第一select

使用超类的单个日志来处理该类和所有子类:

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"); } } 

第二个选项

为每个class级使用单独的日志,super和subs:

 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"); } } 

什么更有意义,为什么?

我也不会做。 相反,我会在这两种情况下使用正确的类。

 public abstract class AbstractFoo { protected final Log log = LogFactory.getLog(getClass()); ... } public class Foo extends AbstractFoo { public void someMethod() { log.info("Using abstract log"); } } 

如果你没有做大量的日志logging(反正这是个好主意),你可以使用一种方法。

 public abstract class AbstractFoo { protected Log log() { return LogFactory.getLog(getClass()); } ... } 

如果有一个类调用了很多,你可以覆盖它给你一个caching的实例。

这是我的解决scheme(最终静态logging器):

 public abstract class AbstractFoo { protected Log getLogger(); public doSomething() { getLogger().info("log something"); } } public class Foo extends AbstractFoo { private static final Log log = Log.getLogger(Foo.class); protected Log getLogger() { return log; } public doSomethingElse() { log.info("log somethingElse"); } } 

两者都有意义。 这取决于你的应用程序。

我认为更常用的做法是为每个class级设置私人logging器。 这允许您为每个类和每个包configuration日志logging。 请记住, AbstractFooFoo可能属于不同的包,可能你只想看到来自Foo日志。

此外,如果你想写protected领域,总是三思。 这不是完全禁止的,而是一个众所周知的坏习惯。 它使你的代码不易读,难于维护。

如果您在抽象类中创buildlogging器,则日志将全部标记为源自AbstractFoo。 如果您希望/需要查看使用发生日志的子类标记的日志,请为子类创buildlogging器。

玩构造函数也是一样的。 在Base类级别添加logging器,并使用super()从每个Derived类设置它。 有这样的代码:

 public abstract class AbstractFoo { protected Log log; // base abstract class has a Log object. public AbstractFoo(Log logger) { // parameterized constructor for logger, to be used by the derived class. this.log = logger; } public doSomething() { // common method for all the derived classes. log.info("log something"); } // rest of business logic. } public class Foo extends AbstractFoo { public Foo(){ super(LogFactory.getLog(AbstractFoo.class)); } public void someMethod() { log.info("Using own log"); // this uses its own logger. } }