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 许可协议。转载请注明出处!