相反,在每一类指定类名的:
log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);
这将是确定的使用方法:
log = Logger.getLogger(this.getClass());
会有什么影响?
相反,在每一类指定类名的:
log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);
这将是确定的使用方法:
log = Logger.getLogger(this.getClass());
会有什么影响?
如果您创建一个子类,日志信息会被记录到子类的记录。
package pkgone;
public class SuperType {
private Logger log = Logger.getLogger(this.getClass());
public void someAction() {
log.info("Doing something");
}
}
。
package pkgtwo;
import pkgone.SuperType;
public class SubType extends SuperType {
// for instances of SubType, the log object in SuperType
// will get initialized with SubType's class object
}
。
// some code somewhere that uses SubType
SubType obj = new SubType();
obj.someAction();
在上面的例子,“做什么”将得到记录到pkgtwo.SubType记录器,而不是pkgone.SuperType记录程序,它可能会或可能不是你想要的是。
试试这个方法来查找一个泛型类...
private static final Log LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());
最好的部分是你可以静态地使用这种方法。
如果你不想重复,使logger
,并希望避免写一个错误的类名,有@Log的项目龙目岛 。
如果你不介意在项目中使用一个以上的库,你可以简单地添加一个记录器,带有一个简单的注解。
import lombok.extern.java.Log;
import lombok.extern.slf4j.Slf4j;
@Log
public class LogExample {
public static void main(String... args) {
log.error("Something's wrong here");
}
}
当然,这似乎罚款。
要知道,一个含义是,如果你可以使用日志从静态上下文有麻烦 - 它可能不被初始化,或者可能不可见
+1调用超级方法sublass情况下,这个记录器将子类。
此外,如果你申请这个作为你的类测井模板,如果你是一个抽象类 - 你this.getClass将因为你没有这个类的一个实例失败。
来自Apache的公共使用日志工厂:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.Logger;
public class SomeNewClass {
...
private final Log logger = LogFactory.getLog(this.getClass());
...
}
不必做任何事情。 不知道的LogFactory是可以在问题后的时间。 如果你不希望使用的LogFactory你也可以简单地使用私人最终用的getClass()。
private final Logger log = Logger.getLogger(this.getClass());
除非你想你的日志可能也与日志配置文件的操作(的log4j.xml您使用的,如果这是什么)完成的层次结构没有理由创建子类。 你就不能使用this.getClass()时记录器被定义为静态的。 如果没有静态或私人最终你离开记录器开到你不想危险可能发生的变化。
有没有影响,因为我知道。 按照马特评论,我想,那是人人都愿意的权利的行为。