log4j.Logger中getLogger的通用方式

use*_*026 16 java log4j

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

log = Logger.getLogger(Foo.class);
log = Logger.getLogger(Bar.class);
log = Logger.getLogger(Test.class);
Run Code Online (Sandbox Code Playgroud)

可以使用:

log = Logger.getLogger(this.getClass());
Run Code Online (Sandbox Code Playgroud)

会有什么影响?

mat*_*tts 19

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

package pkgone;
public class SuperType {
    private Logger log = Logger.getLogger(this.getClass());
    public void someAction() {
        log.info("Doing something");
    }
}
Run Code Online (Sandbox Code Playgroud)

.

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
}
Run Code Online (Sandbox Code Playgroud)

.

// some code somewhere that uses SubType
SubType obj = new SubType();
obj.someAction();
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,"执行某些操作"将记录到pkgtwo.SubType记录器而不是pkgone.SuperType记录器,这可能是您想要的,也可能不是.


dav*_*ain 12

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

private static final Log LOGGER = Logger.getLogger(MethodHandles.lookup().lookupClass());
Run Code Online (Sandbox Code Playgroud)

最好的部分是静态使用此方法.


San*_*Lee 6

如果你不想重复使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");
  }
}
Run Code Online (Sandbox Code Playgroud)