How to get the logger wrapped in slf4j?

六眼飞鱼酱① 提交于 2021-02-20 08:32:13

问题


Is it possible to get the logger wrapped by slf4j ?

For example, in debug mode, when I inspect org.slf4j.LoggerFactory.getLogger(loggerName), I can see the logger (here, java.util.logging) :

java.util.logging Logger

I want to do something like :

// Get the real logger, cast in java.util.logging
java.util.logging.Logger myLogger = LoggerFactory.getLogger(loggerName))...;
// Use the java.util.logging methods
myLogger.setLevel(Level.parse(level)); 

回答1:


I've found a solution using reflection. Looking for the "logger" field in the slf4j Logger.

private <T> T getLogger(final String loggerName, final Class<T> loggerClass) {
    final org.slf4j.Logger logger = LoggerFactory.getLogger(loggerName);
    try {
        final Class<? extends org.slf4j.Logger> loggerIntrospected = logger.getClass();
        final Field fields[] = loggerIntrospected.getDeclaredFields();
        for (int i = 0; i < fields.length; i++) {
            final String fieldName = fields[i].getName();
            if (fieldName.equals("logger")) {
                fields[i].setAccessible(true);
                return loggerClass.cast(fields[i].get(logger));
            }
        }
    } catch (final Exception e) {
        logger.error(e.getMessage());
    }
    return null;
}

Calling with:

java.util.logging.Logger myLogger = getLogger(loggerName, java.util.logging.Logger.class)
// or
org.apache.log4j.Logger myLogger = getLogger(loggerName, org.apache.log4j.Logger.class)

But maybe exists a better solution using the slf4j API ?



来源:https://stackoverflow.com/questions/21329953/how-to-get-the-logger-wrapped-in-slf4j

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!