Log4j原理&源码解析

一、介绍

Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些固有问题。

与Logback一样,Log4j2提供对SLF4J的支持,自动重新加载日志配置,并支持高级过滤选项。 除了这些功能外,它还允许基于lambda表达式对日志语句进行延迟评估,为低延迟系统提供异步记录器,并提供无垃圾模式以避免由垃圾收集器操作引起的任何延迟。

所有这些功能使Log4j2成为这三个日志框架中最先进和最快的。

二、包结构

1)log4j-api、log4j-core

日志的核心实现包。Log4j-api是向外提供的接口层,log4j-core是具体实现层。

2)log4j-jcl

jcl(commons-logging)是apache推出的日志接口,日志的具体实现依赖于实际配置,这样可以分离接口和实现。

log4j-jcl是实现jcl的jar包(只是桥接,核心实现在api和core中)

3)log4j-slf4j-impl

log4j-slf4j-impl是实现slf4j接口的jar包(只是桥接,核心实现在api和core中)

日志框架多且没有统一规范,主流用法是结合slf4j及log4j2结合使用。本文只研究api、core、log4j-slf4j-impl包的实现

三、log4j的主要架构

四、源码解析

4.1 Logger的获取过程

4.1.1 时序图

关键的功能类

LogManager:Log4j日志系统的入口类,最通用的用途是通过getLogger方法向外提供Logger类

LoggerContextFactry:用来定位ContextSelector的工厂,并通过getContext方法向外提供LoggerContext类

LoggerContext:维护应用程序请求的所有Logger的列表和对Configuration的引用。配置记录器、附加器、过滤器等,并在重新配置时自动更新。通过getLogger方法向外提供Logger类

LoggerRegistry:最终Logger map的封装。封装Logger的名称与对应Logger的关联关系。

4.1.2 关键步骤解析

如图中第一步所示,应用请求LogManager获取Logger对象。LogManager.getLogger 代码如下.

追溯getContext函数,代码如下。调用类成员变量LoggerContextFactory.getContext方法获取LoggerContext变量。进入第二步。

factory变量在LoggerManager类的static初始化块内进行加载。代码如下。ProviderUtil类用来判断是否有通过ServiceLoader方式实现Provider类(只是一种动态实现接口的手段)的类。如果有的话。调用Provider实现类的getLoggerContextFactory方法取得LoggerContextFactory并赋予类变量factory。

如图中第二步所示。调用类成员变量LoggerContextFactory.getContext方法获取LoggerContext变量。LoggerContextFactory.getContext方法实现如下。核心代码为使用类内变量ContextSelector.getContext方法获取LoggerContext类。

ContextSelector基于调用者的ClassLoader选择一个LoggerContext。为每一个ClassLoader创建一个LoggerContext并存储到map中。

如图中第三步所示,调用LoggerContext的getLogger方法获取Logger变量,核心代码如下。LoggerRegistry辅助存储映射关系

4.2 Logger.log日志打印过程

4.2.1 时序图

关键的功能类

Logger:链接Filters,Appenders,LoggerConfig。对外实现日志打印动作。

Filters:可以预期,过滤器用于拒绝或接受通过日志系统的日志事件

Appenders:向发布者传递事件,(通常)调用布局来格式化事件,然后以所需的任何方式“发布”事件。可以将Logger打印事件发布给下游,包含kafka,jdbc,控制台等。

Layouts:布局将事件格式化为 Appenders 写到某些目标的可打印文本。所有布局都必须实现 Layout 接口。将事件格式化为 String 的布局应扩展 AbstractStringLayout,它将负责将 String 转换为所需的字节数组。

LoggerConfig:LoggerConfig 对象是应用程序创建的 Logger 与配置绑定的地方。

参考:Log4j2 中文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值