Log4j2
官网地址——http://logging.apache.org/log4j/2.x/
Log4j2介绍
- Apache log4j2是对log4j升级,参考了logback一些优秀的设计,并修复了一些问题
- log4j2中包括日志门面与日志实现但是我们还是会使用slf4j+log4j2日志实现框架而不会使用log4j2自带的日志门面
相比log4j与logback有那些提升
- 异常处理——在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制
- 性能提升——log4j2相较于log4j与logback都具有很明显的性能提升
- 自动重载配置——参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志级别而不需要重启应用
- 无垃圾机制——log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。
依赖
<!-- log4j2 日志实现 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.1</version>
</dependency>
<!-- log4j2 日志门面 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.1</version>
</dependency>
<!-- 适配层 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.9.1</version>
</dependency>
配置文件log4j2.xml详解
<?xml version="1.0" encoding="UTF-8"?>
<!--status是日志框架本身的输出级别-->
<!--monitorInterval是自动加载配置文件的间隔时间-->
<Configuration status="warn" monitorInterval="5">
<!--集中声明property方便其他标签引用,使用时通过${name}进行引用 -->
<Properties>
<Property name="LOG_HOME">/logs</Property>
</Properties>
<!--集中声明日志的Appender -->
<Appenders>
<!--声明控制台Appender -->
<Console name="Console" target="SYSTEM_OUT">
<!--声明控制台Appender的Layout为自定义Layout -->
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" ></PatternLayout>
</Console>
<!--声明fileAppender -->
<File name="file" fileName="${Log_HOME}/myfile.log">
<!--声明fileAppender的Layout为自定义Layout -->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" ></PatternLayout>
</File>
<!--声明随机读写流的日志文件输出的appender 性能提高 -->
<RandomAccessFile name="accessFile" fileName="${Log_HOME}/myAcclog.log">
<!--声明fileAppender的Layout为自定义Layout -->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" ></PatternLayout>
</RandomAccessFile>
<!--日志拆分Appender -->
<RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log" filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!--日志级别过滤器 -->
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志消息格式 -->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n"/>
<!--拆分规则 -->
<Policies>
<!-- 在系统启动时,初始拆分规则,生产一个新的日志文件 -->
<OnStartupTriggeringPolicy/>
<!--按照文件大小拆分 -->
<SizeBasedTriggeringPolicy size="10 MB"/>
<!--按照时间节点拆分,规则根据filePattern定义的 -->
<TimeBasedTriggeringPolicy/>
</Policies>
<!--在同一个目录下,文件的个数限定为30个,超过会按照时间进行覆盖 -->
<DefaultRolloverStrategy max="30"/>
</RollingFile>
</Appenders>
<!--Logger定义 -->
<Loggers>
<!--自定义异步Logger对象 includeLocation=false指的是关闭日志记录的行号信息 ,additivity=false表示不继承rootLogger对象 -->
<AsyncLogger name="cn.shanguoyu.log" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
<!--使用rootLogger配置级别为trace -->
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
异步日志
介绍
log4j2提供了两种实现异步日志的方式,一个是通过AsyncAppender(基本没人用),一个是通过AsyncLogger(分为全局异步和局部异步),分别对应前面我们说的Appender组件和Logger组件。
所需依赖
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
全局异步日志
- 创建一个配置文件名为——log4j2.component.properties
- 粘贴一行配置——Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
局部异步日志
- 关闭全局异步日志
- 添加如下配置
<!--Logger定义 -->
<Loggers>
<!--自定义异步Logger对象 includeLocation=false指的是关闭日志记录的行号信息 ,additivity=false表示不继承rootLogger对象 -->
<AsyncLogger name="cn.shanguoyu.log" level="trace" includeLocation="false" additivity="false">
<AppenderRef ref="Console"/>
</AsyncLogger>
<!--使用rootLogger配置级别为trace -->
<Root level="trace">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
log4j2无垃圾模式
介绍
- 垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。
- 许多日志库(包括以前版本的log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串,字符数组,字节数组等。这会对垃圾收集器造成压力并增加GC暂停发生的概率
- 从log4j2 2.6版本开始,默认情况下log4j2以无垃圾模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象,还有一个低垃圾模式,它不是完全无垃圾,但不适用ThreadLocal字段。
- log4j2 2.6中的无垃圾日志记录部分通过重用ThreadLocal字段中的对象来实现,部分通过在讲文本转换为字节时重用缓冲区来实现。