18

而不是在每个类上指定类名:

log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);

可以使用吗:

log = Logger.getLogger(this.getClass());

会有什么影响?

4

8 回答 8

20

如果您创建子类,日志消息将被记录到子类的记录器中。

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 记录器,这可能是也可能不是您想要的。

于 2012-05-23T18:08:11.017 回答
13

尝试以这种方式查找泛型类...

private static final Log LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());

最好的部分是您可以静态使用此方法。

于 2016-11-30T21:53:50.913 回答
6

如果您不想重复制作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");
  }
}
于 2015-08-21T05:48:18.240 回答
2

当然,这看起来不错。

请注意,其中一个含义是,如果您在使用静态上下文中的日志时可能遇到问题 - 它可能未初始化或可能不可见

于 2012-05-23T18:04:50.380 回答
1

+1 对于调用超级方法的子类实例,记录器将是子类。

此外,如果您将此作为类的日志记录模板应用,如果您的类是抽象的 - 您的 this.getClass 将失败,因为您没有此类的实例。

于 2013-04-19T14:15:39.847 回答
1

使用来自 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,您会使记录器对您不想要的危险可能更改开放。

于 2014-10-28T18:33:04.987 回答
1
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);
于 2019-12-03T09:06:07.680 回答
-1

据我所知,没有任何影响。根据马特的评论,我猜这是每个人都想要的正确行为。

于 2012-05-23T18:30:45.017 回答