Java日志框架源码学习笔记(二)

版权声明:本文为博主原创文章,请尊重劳动成果,转载注明一下出处。 https://blog.csdn.net/zq1994520/article/details/79058106

场景再现:

<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();
        }
    }
如有疑问,或者错误,请留言提示,好东西要一起共享。

本文原创,转载请注明出处,谢谢。

上一篇:Java日志框架源码学习笔记(一)

猜你喜欢

转载自blog.csdn.net/zq1994520/article/details/79058106