场景再现:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<slf4j-log4j-version>2.9.1</slf4j-log4j-version>
</properties>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${slf4j-log4j-version}</version>
<scope>test</scope>
</dependency>
</dependencies>
log4j2 基础:
log4j2框架分为两个jar包,一个api,一个core。
api跟slf4j一样提供统一的实现接口,还有一些接口的默认简单实现,比如simple包里面的类。
log4j2-api包目录结构:
message: 控制对象跟表达式加参数用怎么方式打印(我的理解)。
simple: log4j2里面对日志打印简单实现。
spi: 串行外设接口(Serial Peripheral Interface)
status:
util: 提供读取各类参数文件的工具类,重要的有PropertiesUtil(读取参数文件),ProviderUtil(读取org.apache.logging.log4j.spi.Provider在的实现类。读取log4j2-core中org.apache.logging.log4j.core.impl.Log4jProvider详细查看),LoaderUtil(通过字符串获取class,通过文件名称获取他的绝对路径file:/G:/ideaWork/log4jTest/target/test-classes/log4j2.component.properties)。
log4j2主要主要过程相关er图:
log4j2主要过程调用顺序序列图:
附带UML设计文件:
starUML软件打开这里写链接内容
密码:z3sz
关键节点解释:
1、从log4j2-api调用log4j2-core包里面的实现是通过Provider类完成的。详细查看
2、ClassLoaderContextSelector类是决定返回LoggerContext是什么,这个返回实现类型跟配置文件相关。
public LoggerContext getContext(final String fqcn, final ClassLoader loader, final boolean currentContext,
final URI configLocation) {
if (currentContext) {
final LoggerContext ctx = ContextAnchor.THREAD_CONTEXT.get();
if (ctx != null) {
return ctx;
}
return getDefault();
} else if (loader != null) {
return locateContext(loader, configLocation);
} else {
final Class<?> clazz = StackLocatorUtil.getCallerClass(fqcn);
if (clazz != null) {
return locateContext(clazz.getClassLoader(), configLocation);
}
final LoggerContext lc = ContextAnchor.THREAD_CONTEXT.get();
if (lc != null) {
return lc;
}
return getDefault();
}
}
如有疑问,或者错误,请留言提示,好东西要一起共享。
本文原创,转载请注明出处,谢谢。