好吧,从技术上讲,SLF4J 没有为您提供 logger.log(Level, message) 方法。但我找到了解决办法。[编辑:使用内省]
使用下面的代码片段,您可以获得 slf4j 在运行时为您找到并包装的本机记录器。如果你还记得,slf4j 只是一个包装器,它来自另一个提供者(jdkLogging、Log4J、JCL 等)的 slf4j 实现。所以在这里:
public Object getNativeLogger( org.slf4j.Logger logger ) {
Object result = null;
if ( logger.getClass().getName().equals("org.slf4j.impl.Log4jLoggerAdapter")) {
try {
Field f = Log4jLoggerAdapter.class.getDeclaredField("logger");
f.setAccessible( true );
result = (org.apache.log4j.Logger)f.get(logger);
}
catch( Exception e ) {
System.out.println("Unable to access native log4j logger");
}
}
else if ( logger.getClass().getName().equals("org.slf4j.impl.JDK14LoggerAdapter")) {
try {
Field f = Jdk14Logger.class.getDeclaredField("logger");
f.setAccessible( true );
result = (Jdk14Logger)f.get(logger);
}
catch( Exception e ) {
System.out.println("Unable to access native log4j logger");
}
}
else if (..... other native loggers slf4j supports)....
}
return result;
}
然后你可以像这样使用它:
Object l = getNativeLogger(mySlf4jLogger);
if ( l instanceof org.apache.log4j.Logger ) {
org.apache.log4j.Logger logger = (org.apache.log4j.Logger) l;
logger.log( CUSTOMLog4JLevel, message);
}
else if( .... other implementations that you care about ...)...
因此,虽然它在技术上不在 slf4j 中,但可以使用 slf4j 作为您的主要日志接口。