而不是在每个类上指定类名:
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
并想避免编写错误的类名,那么可以使用Project Lombok的@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 对于调用超级方法的子类实例,记录器将是子类。
此外,如果您将此作为类的日志记录模板应用,如果您的类是抽象的 - 您的 this.getClass 将失败,因为您没有此类的实例。
使用来自 Apache commons 的日志工厂:
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,您也可以简单地将私有 final 与 getClass() 一起使用。
private final Logger log = Logger.getLogger(this.getClass());
没有理由创建子类,除非您想要日志的层次结构,这也可以通过操作日志配置文件(如果您使用的是 log4j.xml)来完成。当记录器定义为静态时,您不能使用 this.getClass() 。如果没有 static 或 private final,您会使记录器对您不想要的危险可能更改开放。
public final class AppLogger {
private AppLogger() {}
public static final void logInfo(Class<?> clazz, String logMessage) {
Logger logger = Logger.getLogger(clazz);
if (logger.isInfoEnabled()) {
logger.info(logMessage);
}
}
public static final void logInfo(Class<?> clazz, String logMessage, Throwable th) {
Logger logger = Logger.getLogger(clazz);
if (logger.isInfoEnabled()) {
logger.info(logMessage, th);
}
}
}
创建此类,然后将其添加到您的调用类中:
Applogger.logInfo(Class.class,String var);
据我所知,没有任何影响。根据马特的评论,我猜这是每个人都想要的正确行为。