日志框架Log4j的学习小记
首先说的就是slf4j这个门面,之前在重构这本书中就提到要善于抽象代码形成主体结构。然后在定制化的工作中进行重载等工作,Slf4j就将日志的一般方法进行定义。并提供了一些默认的日志打印方法。
public static Logger logger= LoggerFactory.getLogger("123");










说到这里,可能就有一个疑问了,我们的配置文件中好像有个配置。可以指定这个log4j.xml文件的地址和名称,如下所示,于是乎我们在之前的那个代码写死的是不是我们理解的不对。
logging.config=classpath:config/log4j2.xml跟着代码,我们发现在Spring的监听器中有这样的代码。
private void onApplicationStartingEvent(ApplicationStartingEvent event) {//这里的logginSystem经过这里的处理就变成了Log4J2LoggingSystem,此类中包含我们上边说的logmanger部分,也就是解析xml的部分,也就是创建线程。初次之外这里的log4j2LogginSystem也是我们上次说的RunTime回调定义的地方。this.loggingSystem = LoggingSystem.get(event.getSpringApplication().getClassLoader());//前置初始化this.loggingSystem.beforeInitialize();}
//从配置文件中拿到logging.config并进行LoggingSystem的初始化private void initializeSystem(ConfigurableEnvironment environment, LoggingSystem system, LogFile logFile) {LoggingInitializationContext initializationContext = new LoggingInitializationContext(environment);String logConfig = environment.getProperty("logging.config");if (this.ignoreLogConfig(logConfig)) {system.initialize(initializationContext, (String)null, logFile);} else {try {ResourceUtils.getURL(logConfig).openStream().close();//这块在初始化的时候对配置文件进行解析,并对logger进行注册。system.initialize(initializationContext, logConfig, logFile);} catch (Exception var7) {System.err.println("Logging system failed to initialize using configuration from '" + logConfig + "'");var7.printStackTrace(System.err);throw new IllegalStateException(var7);}}}//加载配置文件 ,location为配置文件中的日志xml文件地址protected void loadConfiguration(String location, LogFile logFile) {Assert.notNull(location, "Location must not be null");try {//拿到logmanger中的日志LoggerContext ctx = this.getLoggerContext();URL url = ResourceUtils.getURL(location);ConfigurationSource source = this.getConfigurationSource(url);ctx.start(ConfigurationFactory.getInstance().getConfiguration(ctx, source));} catch (Exception var6) {throw new IllegalStateException("Could not initialize Log4J2 logging from " + location, var6);}}
这块写的有点乱,作者本人也迷迷糊糊的。想着大概的过程应该是这样的,但是遇到了不同的logger注册器,有hashtable、concurentHashMap以及hashMap,有点乱。一句话还是没深刻的理解吧,大概的过程咋算是大概的说了一下了。对于动态修改日志级别的这种问题,因为我们的java是引用传值,因此我们我们直接从logmanager中获取指定名称的logger,然后修改日志level即可。当然日志的缓存队列我们可以采用阻塞链表来做。
由于作者水平有限,分析的不是很透彻,作者本人也是知道一个大概的方向,细节上也是迷迷糊糊,惭愧!如对大家有一定的误导,还望见谅!
评论
