log4j2 使用介绍
Apache Log4j2是对Log4j的升级版,参考了Logback的一些优秀设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
- 异常处理,在Logback中,Appender中的异常不会被应用感知,但是在Log4j2中,提供了一些异常处理机制。
- 性能提升,Log4j2相较于Log4j和Logback都具有很明显的性能提升。
- 自动重载配置,参考了Logback的设计,当然会提供自动刷新参数的配置,最实用的就是我们在生产上可以动态的修改日志的级别,而不需要重启应用。
- 无垃圾机制,Log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。
配置文件的名称以及在项目中的存放位置:
log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为.xml,.json 或者.jsn。系统选择配置文件的优先级(从先到后)如下:
- classpath 下的名为log4j2-test.json或者log4j2-test.jsn的文件.
- classpath 下的名为log4j2-test.xml的文件.
- classpath 下名为log4j2.json或者log4j2.jsn的文件.
- classpath 下名为log4j2.xml的文件.
我们一般默认使用log4j2.xml进行命名。如果本地要测试,可以把log4j2-test.xml放到classpath,而正式环境使用log4j2.xml,则在打包部署的时候不要打包log4j2-test.xml即可。
log4j2 日志级别:
- All:最低等级的,用于打开所有日志记录.
- Trace:是追踪,就是程序推进以下,你就可以写个trace输出,所以trace应该会特别多,不过没关系,我们可以设置最低日志级别不让他输出.
- Debug:指出细粒度信息事件对调试应用程序是非常有帮助的.
- Info:消息在粗粒度级别上突出强调应用程序的运行过程.
- Warn:输出警告及warn以下级别的日志.
- Error:输出错误信息日志.
- Fatal:输出每个严重的错误事件将会导致应用程序的退出的日志.
- OFF:最高等级的,用于关闭所有日志记录.
pattern参数:
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M 输出所在方法名
%l 输出语句所在的行数, 包括类名、方法名、文件名、行数
需要的Maven依赖:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifact
<version>1.7.30</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log
<artifactId>log4j-core</artifac
<version>2.13.3</version>
</dependency>
<!--slf4j+log4j2-->
<dependency>
<groupId>org.apache.logging.log
<artifactId>log4j-slf4j-impl</a
<version>2.13.3</version>
</dependency>
<!--log4j2 异步日志依赖-->
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifact
<version>3.4.2</version>
</dependency>
log4j2.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!--
status log4j2自身内部的日志级别
monitorInterval Log4j自动检测间隔秒数
-->
<configuration status="WARN" monitorInterval="30">
<properties>
<!--日志目录-->
<Property name="LOG_HOME">logs2</Property>
</properties>
<appenders>
<!--控制台输出-->
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
</console>
<!--简单的日志文件-->
<File name="log" fileName="${LOG_HOME}/test.log" append="false">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
</File>
<!-- 日志输出到文件 并指定拆分规则-->
<RollingFile name="RollingFileInfo" fileName="${LOG_HOME}/info.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
<!--过滤器 只统计info级别-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<!--日志信息 格式-->
<PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
<!--指定规则-->
<Policies>
<!--按照时间拆分 规则如上filePattern-->
<TimeBasedTriggeringPolicy/>
<!--指定日志文件尺寸-->
<SizeBasedTriggeringPolicy size="100 MB"/>
</Policies>
<!--指定保留文件的个数 默认同一目录下7个-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.springframework" level="INFO"></logger>
<logger name="org.mybatis" level="INFO"></logger>
<root level="all">
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileInfo"/>
</root>
</loggers>
</configuration>

浙公网安备 33010602011771号