由Logger的名称可以知道这句的意思是用Logger工厂获取Logger实例,但是不明白其中的原理,看了看源码:
LoggerFactory中的getLogger方法,返回一个以name命名的静态绑定的实例,而这个name一般以Logger实例所在的类命名,如通过类名.Class.getName()获取。
public static Logger getLogger(String name) { ILoggerFactory iLoggerFactory = getILoggerFactory(); return iLoggerFactory.getLogger(name); }
ILoggerFactory的接口实例在编译时内部绑定LoggerFactory,这个接口中只有一个public Logger getLogger(String name)方法,根据参数名称返回适当的实例
看看这个getILoggerFactory()方法
public static ILoggerFactory getILoggerFactory() { if (INITIALIZATION_STATE == UNINITIALIZED) { INITIALIZATION_STATE = ONGOING_INITIALIZATION; performInitialization(); } switch (INITIALIZATION_STATE) { case SUCCESSFUL_INITIALIZATION: return StaticLoggerBinder.getSingleton().getLoggerFactory(); case NOP_FALLBACK_INITIALIZATION: return NOP_FALLBACK_FACTORY; case FAILED_INITIALIZATION: throw new IllegalStateException(UNSUCCESSFUL_INIT_MSG); case ONGOING_INITIALIZATION: // support re-entrant behavior. // See also http://bugzilla.slf4j.org/show_bug.cgi?id=106 return TEMP_FACTORY; } throw new IllegalStateException("Unreachable code"); } }
很明显这是返回ILoggerFactory的实例,用于调取getLogger方法。在Logger接口中规定了日志的输出的方法,根据相应的参数需要设置就可以在控制台看到输出的日志信息了。
时间: 2024-10-17 08:14:52