日志框架Log4j的學(xué)習(xí)小記
首先說的就是slf4j這個(gè)門面,之前在重構(gòu)這本書中就提到要善于抽象代碼形成主體結(jié)構(gòu)。然后在定制化的工作中進(jìn)行重載等工作,Slf4j就將日志的一般方法進(jìn)行定義。并提供了一些默認(rèn)的日志打印方法。
public static Logger logger= LoggerFactory.getLogger("123");










說到這里,可能就有一個(gè)疑問了,我們的配置文件中好像有個(gè)配置。可以指定這個(gè)log4j.xml文件的地址和名稱,如下所示,于是乎我們在之前的那個(gè)代碼寫死的是不是我們理解的不對。
logging.config=classpath:config/log4j2.xml跟著代碼,我們發(fā)現(xiàn)在Spring的監(jiān)聽器中有這樣的代碼。
private void onApplicationStartingEvent(ApplicationStartingEvent event) {//這里的logginSystem經(jīng)過這里的處理就變成了Log4J2LoggingSystem,此類中包含我們上邊說的logmanger部分,也就是解析xml的部分,也就是創(chuàng)建線程。初次之外這里的log4j2LogginSystem也是我們上次說的RunTime回調(diào)定義的地方。this.loggingSystem = LoggingSystem.get(event.getSpringApplication().getClassLoader());//前置初始化this.loggingSystem.beforeInitialize();}
//從配置文件中拿到logging.config并進(jìn)行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();//這塊在初始化的時(shí)候?qū)ε渲梦募M(jìn)行解析,并對logger進(jìn)行注冊。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);}}
這塊寫的有點(diǎn)亂,作者本人也迷迷糊糊的。想著大概的過程應(yīng)該是這樣的,但是遇到了不同的logger注冊器,有hashtable、concurentHashMap以及hashMap,有點(diǎn)亂。一句話還是沒深刻的理解吧,大概的過程咋算是大概的說了一下了。對于動(dòng)態(tài)修改日志級(jí)別的這種問題,因?yàn)槲覀兊膉ava是引用傳值,因此我們我們直接從logmanager中獲取指定名稱的logger,然后修改日志level即可。當(dāng)然日志的緩存隊(duì)列我們可以采用阻塞鏈表來做。
由于作者水平有限,分析的不是很透徹,作者本人也是知道一個(gè)大概的方向,細(xì)節(jié)上也是迷迷糊糊,慚愧!如對大家有一定的誤導(dǎo),還望見諒!
評論
圖片
表情
