从log4j.Logger获取Logger的通用方式

uqzxnwby  于 2022-11-06  发布在  其他
关注(0)|答案(8)|浏览(184)

不要在每个类上指定类名:

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

是否可以用途:

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

会有什么影响?

toiithl6

toiithl61#

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

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

fkaflof6

fkaflof62#

请尝试使用此方法查找泛型类...

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

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

zhte4eai

zhte4eai3#

如果你不想重复make logger并且想避免写错类名,这里有@Log的Project Lombok
如果您不介意在项目中多使用一个库,您可以添加一个带有简单注解的记录器。

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");
  }
}
txu3uszq

txu3uszq4#

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

dly7yett

dly7yett5#

+1对于调用超级方法的子类示例,记录器将是子类。
此外,如果您将此应用为类的日志模板,并且您的类是抽象的,则this.getClass将失败,因为您没有此类的示例。

cu6pst1q

cu6pst1q6#

使用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,你也可以简单地使用带有getClass()的private final。

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

没有理由创建子类,除非你想要一个你的日志记录的层次结构,这也可以通过操作日志配置文件(如果你正在使用log4j.xml)来完成。当日志记录器被定义为静态的时候,你不能使用这个.getClass()。没有static或者private final,你会让日志记录器对你不想要的危险的可能的改变开放。

kse8i1jr

kse8i1jr7#

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);
wz8daaqr

wz8daaqr8#

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

相关问题