log4j2
Apache log4j 2 是对log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题
 异常处理:logback中,appender中的异常不会被应用感知到,但是在log4j中,提供了一些异常处理机制
 性能提升:log4j2相较于log4j和logback 都具有明显的性能提升
 自动重载配置,参考了logback的设计,当然会提供自动刷新参数配置,可以动态修改配置而不需要重启应用
 无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致jvm的 gc
pom.xml
1  | 
  | 
名词
Logger
1  | org.apache.logging.log4j  | 
AbstractLogger
1  | 
  | 
StatusLogger
1  | /*  | 
Logger
1  | 
  | 
PrivateConfig
1  | 每一个logger都内置一个私有配置的对象  | 
LoggerConfig
1  | 
  | 
‘ReliabilityStrategy
1  | 
  | 
LoggerContext
1  | 
  | 
LoggerContext
1  | 
  | 
AsyncLoggerContext
1  | 
  | 
LoggerRegistry
1  | //{@code LoggerContext}实现使用的便利类。  | 
MarkerManager
1  | //应用程序使用标记管理器创建标记。此管理器创建的所有标记都是不可变的。  | 
Marker
1  | org.apache.logging.log4j;  | 
MessageFactory
1  | 
  | 
Message
1  | 
  | 
LifeCycle
1  | 
  | 
Filterable
1  | extends LifeCycle  | 
Configuration
1  | extends Filterable  | 
AbstractConfiguration
1  | 
  | 
PluginManager
1  | 
  | 
PluginType
1  | /*  | 
PluginEntry
1  | //用于将插件项存储到缓存文件的Memento对象。  | 
AutoCloseable
1  | java.lang  | 
Provider
1  | 
  | 
LoggerContextFactory
1  | 
  | 
Log4jContextFactory
1  | implements LoggerContextFactory, ShutdownCallbackRegistry  | 
ContextSelector
1  | 用于定位LoggerContext的接口。  | 
StrSubstitutor
1  | 
  | 
StrLookup
1  | //查找字符串值的字符串键。  | 
MBeanServer
1  | 继承 MBeanServerConnection:此接口表示与MBean服务器(无论是本地服务器还是远程服务器)的通信方式。{ MBeanServer}接口(表示本地MBean服务器)扩展了此接口。  | 
源码流程
工厂获取
1  | 
  | 
工厂的初始化
1  | 
  | 
工厂的获取是利用Provider的服务自动发现 来找到 工厂具体类型
LoggerContext的获取
1  | 
  | 
Logger获取
1  | 
  | 
执行:
1  | 
  | 
真正log4j2的日志处理
1  | 
  | 
配置文件
ConfigurationFactory
1  | 
  | 
插件机制
1  | PluginManager  | 
Configuration.start()
1  | 
  | 
xml配置文件解析
1  | 
  | 
如何解析dom
1  | 
  | 
真正做配置
1  | 
  | 
使用
1  | 
  | 
在类路径下创建一个log4j2.xml文件
1  | 
  | 
与slf4j日志门面整合
pom.xml
1  | 
  | 
原理:
1  | 通过 包名加类名完全一样的一个不同的StaticLoggerBinder来获取一个日志工厂  | 
同步和异步
同步流程
1  | 
  | 
异步:
Logger.info —–>Logger —logevent—> 放入 ArrayBlokingQueue(能放入立即返回)
处理日志事件的线程 不断从队列获取 日志事件,然后调用对应的appender进行处理
异步处理主要提供两种 AsyncLogger和AsyncAppender
官网对异步logger和异步appender做了一些性能比较,发现最好的是 该日志系统全部使用异步logger,其次 有一部分是同步logger,而另一部分是异步logger,异步appender没什么性能提升
pom.xml
1  | 
  | 
虽然异步的appender没什么提升,但还是看一下
异步appender是引入logback思想,无需disruptor
1  | 
  | 
异步logger
第一种,就是通过指定asyncLoggerContextSeletor来获取AsyncLoggerContext进一步获取AsyncLogger
类路径下 创建
log4j2.component.properties
1  | log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector  | 
混合异步
使用混合,必须把全局的先关闭
1  | 
  | 
源码
AsyncLoggerDisruptor
1  | /*  | 
队列初始化
1  | 
  | 
无垃圾模式
1  | 
  | 
RollingRandomAccessFileAppender
1  | 
  | 
自己弄的一个配置
1  | 
  | 
1  | /*  | 
- 本文作者: 忘忧症
 - 本文链接: https://NepenthesZGW.github.io/2020/02/20/framework/log/log4j2/
 - 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
 
		