目录
简介
- Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题
- 被誉为是目前最优秀的Java日志框架
特性
- 在多线程场景中,异步记录器的吞吐量比Log4j 1.x和Logback高18倍,延迟低
- 与Logback一样,Log4j2可以在修改时自动重新加载其配置
- 与Logback不同,它会在重新配置发生时不会丢失日志事件
使用
依赖
<!-- log4j2日志门面 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2日志实现 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
单独使用Log4j2,默认为error级别信息才打印
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;
public class LogTest {
@Test
public void test(){
Logger logger = LogManager.getLogger(LogTest.class);
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
注意Logger使用的是 org.apache.logging.log4j包下的
控制台输出如下
ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2
18:29:06.256 [main] FATAL LogTest - fatal信息
18:29:06.263 [main] ERROR LogTest - error信息
基本配置文件
默认路径 resouce/log4j2.xml
- %-10level 级别:案例为设置10个字符,左对齐
- %d{yyyy-MM-dd HH:mm:ss.SSS}:日期
- %c: 当前类全限定名
- %M: 当前执行日志的方法
- %L: 行号
- %thread: 线程名称
- %m或者%msg: 信息
- %n: 换行
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--配置全局通用属性-->
<properties>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c %M %L %thread %m%n"/>
</properties>
<!-- 配置appender -->
<Appenders>
<!-- 配置控制台输出 -->
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}"/>
</Console>
</Appenders>
<!-- 配置logger -->
<Loggers>
<!-- 配置rootlogger -->
<Root level="trace">
<!-- 引用Appender -->
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>
- <Configuration status=“debug” monitorInterval=“数值”>
- monitorInterval=“5” 自动加载配置文件的间隔时间,不低于5秒
继续执行前一个测试方法,输出结果如下:
2022-09-22 18:40:46.261 [FATAL] LogTest test 9 main fatal信息
2022-09-22 18:40:46.268 [ERROR] LogTest test 10 main error信息
2022-09-22 18:40:46.268 [WARN ] LogTest test 11 main warn信息
2022-09-22 18:40:46.268 [INFO ] LogTest test 12 main info信息
2022-09-22 18:40:46.268 [DEBUG] LogTest test 13 main debug信息
2022-09-22 18:40:46.269 [TRACE] LogTest test 14 main trace信息
Process finished with exit code 0
slf4j + log4j2
当前市场上最强大的,最主流的日志搭配方式: slf4j + log4j2
依赖
<!-- slf4j日志门面 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- log4j适配器 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2日志门面 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.12.1</version>
</dependency>
<!-- log4j2日志实现 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
简单配置文件
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--配置全局通用属性-->
<properties>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c %M %L %thread %m%n"/>
</properties>
<!-- 配置appender -->
<Appenders>
<!-- 配置控制台输出 -->
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}"/>
</Console>
</Appenders>
<!-- 配置logger -->
<Loggers>
<!-- 配置rootlogger -->
<Root level="trace">
<!-- 引用Appender -->
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>
导包测试
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
@Test
public void test(){
Logger logger = LoggerFactory.getLogger(LogTest.class);
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
}
}
注意导包已经不是log4j2中的Logger,使用的是用slf4j的Logger
org.slf4j.Logger
输出结果如下
2022-09-22 18:47:18.048 [ERROR] LogTest test 10 main error信息
2022-09-22 18:47:18.051 [WARN ] LogTest test 11 main warn信息
2022-09-22 18:47:18.051 [INFO ] LogTest test 12 main info信息
2022-09-22 18:47:18.051 [DEBUG] LogTest test 13 main debug信息
2022-09-22 18:47:18.052 [TRACE] LogTest test 14 main trace信息
Process finished with exit code 0
日志拆分
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<!--配置全局通用属性-->
<properties>
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c %M %L %thread %m%n"/>
<!-- 配置文件的输出路径 -->
<property name="LOG_HOME" value="E://Temp//log" />
<property name="APP_NAME" value="log4j2-demo"/>
<property name="VERSION" value="snapshoot"/>
</properties>
<!-- 配置appender -->
<Appenders>
<!-- 配置控制台输出 -->
<Console name="consoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="${pattern}"/>
</Console>
<!--
按照指定规则来拆分日志文件
fileName:日志文件的名字
filePattern:日志文件拆分后文件的命名规则
$${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹
例如:2021-01-01这个文件夹中,记录当天的所有日志信息
(拆分出来的日志放在这个文件夹中)
2021-01-02这个文件夹中,记录当天的所有日志信息
(拆分出来的日志放在这个文件夹中)
rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复
-->
<RollingFile name="rollingFile"
fileName="${LOG_HOME}/${APP_NAME}/${VERSION}/rollog.log"
filePattern="${LOG_HOME}/${APP_NAME}/${VERSION}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
<!-- 日志消息格式 -->
<PatternLayout pattern="${pattern}"/>
<Policies>
<!-- 在系统启动时,触发拆分规则,产生一个日志文件 -->
<OnStartupTriggeringPolicy/>
<!-- 按照文件的大小进行拆分 -->
<SizeBasedTriggeringPolicy size="10KB"/>
<!-- 按照时间节点进行拆分 拆分规则就是filePattern-->
<TimeBasedTriggeringPolicy/>
</Policies>
<!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则-->
<DefaultRolloverStrategy max="20"/>
</RollingFile>
</Appenders>
<!-- 配置logger -->
<Loggers>
<!-- 配置rootlogger -->
<Root level="trace">
<!-- 引用Appender -->
<AppenderRef ref="rollingFile"/>
<AppenderRef ref="consoleAppender"/>
</Root>
</Loggers>
</Configuration>
文件输出: