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 中文

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Log4j是一个Java日志管理工具,它提供了一种灵活的配置方式,可以方便地生成和管理应用程序日志。 要使用Log4j配置格式解析日志文件,需要完成以下步骤: 1. 配置Log4j:在Java应用程序中添加Log4j库并配置它。可以通过在项目中添加log4j.properties或log4j.xml文件来配置Log4j。这些文件包含Log4j的配置信息,例如输出日志到控制台还是文件,日志级别,日志格式等。 2. 添加日志语句:在Java代码中添加日志语句。可以使用Log4jAPI来记录日志。例如: ``` import org.apache.log4j.Logger; public class MyClass { private static final Logger logger = Logger.getLogger(MyClass.class); public void myMethod() { logger.info("This is an info message"); logger.debug("This is a debug message"); } } ``` 在这个例子中,我们使用Log4j的Logger类来创建一个日志对象,然后使用它的info()和debug()方法记录日志。 3. 运行应用程序:运行Java应用程序并让它记录日志。当程序运行时,它会按照Log4j的配置记录日志。 4. 解析日志文件:通过读取Log4j生成的日志文件来解析日志。Log4j可以将日志输出到控制台或文件中,根据配置文件的设置,我们可以选择使用工具或手动方式解析生成的日志文件。可以使用Log4j提供的工具或第三方工具来解析日志文件。 5. 格式化日志:在解析日志文件时,可以根据需要对日志进行格式化。使用Java提供的字符串处理和正则表达式等工具,可以方便地解析和格式化日志。 总之,使用Log4j可以方便地生成和管理应用程序日志,并通过解析和格式化日志文件来提取有用的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值