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。 请记住, AbstractFoo
和Foo
可能属于不同的包,可能你只想看到来自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. } }