2014-01-24 55 views
5

是否有可能讓記錄器被slf4j包裝?如何讓包裝在slf4j中的記錄器?

例如,在調試模式下,當我檢查org.slf4j.LoggerFactory.getLogger(loggerName),我可以看到記錄器(在這裏,java.util.logging):

java.util.logging Logger

我想要做的事,如:

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

回答

3

我找到了使用反射的解決方案。 尋找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; 
} 

與呼喚:

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) 

但也許存在使用SLF4J API更好的解決方案?

+1

感謝您的解決方案!我不得不在返回行中刪除「記錄器」的引號,所以「get」應該採用記錄器實例而不是字符串。 –