日志框架Log4j的学习小记
写点笔记
共 3885字,需浏览 8分钟
·
2021-07-17 23:35
首先说的就是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即可。当然日志的缓存队列我们可以采用阻塞链表来做。
由于作者水平有限,分析的不是很透彻,作者本人也是知道一个大概的方向,细节上也是迷迷糊糊,惭愧!如对大家有一定的误导,还望见谅!
评论