25. SpringBoot log4j2详解
前言
大家肯定都对Log4j非常熟悉,一种日志插件,Apache旗下的开源项目。但是不排除还有的小伙伴忘了,没关系,接下来我会大家回忆一下下Log4j。
Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI 组件、甚至是套接口服务 器、NT 的事件记录器、UNIX Syslog 守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就 是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。Log4j由三部分构成:
- 日志信息优先级。
表示用来指定这条日志信息的重要程度。
- 日志信息输出目的地。
表示日志信息的输出目的地指定了日志将打印到控制台还是文件中;
- 日志信息输出格式。
表示输出格式则控制了日志信息的显示内容。
而今天我要介绍的是Log4j的进阶版,Log4j2,它比其前身Log4j 1.x有做重大改进,并改进了Logback,同时修复了Logback架构中的一些问题;可以说是目前最优秀的Java日志框架,没有之一。
2. jar依赖包
<!-- log4j2的依赖引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
3. 日志使用
为了演示log4j2的基本功能点,接下来我给创建一个测试用例,进行日志不同级别输出演示。
package com.example.demo;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author luoYong
* @version 1.0
* @date 2022/11/17 16:46
*/
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Log4j2Test {
private static Logger logger = LogManager.getLogger(Log4j2Test.class);
@Test
void log4j2Test() throws Exception {
// 一直打印日志,用于测试Log4j2功能
logAll();
}
// 打印各种级别的日志用于测试
public static void logAll() throws Exception {
//TRACE < DEBUG < INFO < WARN < ERROR < FATAL
logger.trace("trace level log");
logger.debug("debug level log");
logger.info("info level log");
logger.warn("warn level log");
logger.error("error level log");
logger.fatal("fatal level log");
}
}
接着我们来看下控制台输出:
4. 日志级别:
对于log4j2日志级别,它志信息的优先级从高到低排有ERROR>WARN>INFO>DEBUG,完整来说是有8种(ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF)。
当日志级别设置为某一级别时,则会打印大于等于该级别的日志,比如日志级别设置为ERROR,则会打印ERROR,FATAL级别的日志,也就是当你设置日志级别为ALL,则会把所有级别的日志都打印出来,OFF则不打印任何级别的日志,所以严格来讲只有6种日志级别。
5. 日志打印
我们随意在非测试类中写个程序,让日志进行打印。
//开始使用日志进行输出
@GetMapping("/demo1")
public void test1(){
log.info("程序执行咯!记录日志啦");
}
我们可以来看控制台,到底输出了什么?
17:01:22.215 [http-nio-8080-exec-5] INFO com.example.demo.controller.TestController - 程序执行咯!记录日志啦
知道这一长串都表达什么意思呢?不急,咱们往下看。
6. log4j2.xml配置文件
给大家演示个比较简短的配置文件作为示例进行讲解;
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="ERROR">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
对于上方配置文件,主要有两类配置,
一类是Appenders:定义日志输出目的地,内容和格式等。
另一类是Loggers:定义日志级别和使用的Appenders。
具体讲述一下Appenders配置
Appenders表示日志输出到控制台的标准输出。
<!--输出日志的格式-->
<PatternLayout pattern="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
pattern定义日志输出格式:
- %date{HH:mm:ss.SSS}:表示输出日志的打印日期,精确到毫秒。
- [%thread]:表示当前线程名称。
- %-5level:表示级别从左显示5个字符宽度。
- %logger{36}:表示输出Logger名称最长36个字符;一般是类的全限定路径名。
- %msg:表示日志信息。
- %n:表示日志换行。
接着给大家看下实际如上设置,控制台输出的日志会是如何?
17:01:22.215 [http-nio-8080-exec-5] INFO com.example.demo.controller.TestController - 程序执行咯!记录日志啦
这不,还是上面第4点介绍日志等级给大家写的demo样式输出的日志样式,这样你们就能很好的理解了吧。