Spring Boot学习笔记05——日志

1. 日志介绍

市面上有很多日志框架,如JUL、JCL、logback、log4j等等;spring boot的底层是spring框架,spring默认使用JCL,但是springboot选用的是SLF4j(日志门面)和logback(日志实现)

开发时,日志记录方法的调用,不应该来直接调用日志的实现类,而是调用日志抽象层中的方法;给系统中导入slf4j的jar包和logback的实现jar包

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class HelloWorld {
  public static void main(String[] args) {
    Logger logger = LoggerFactory.getLogger(HelloWorld.class);
    logger.info("Hello World");
  }
}

Spring Boot学习笔记05——日志_第1张图片

每一个日志的实现框架都有自己的配置文件,使用slf4j后,配置文件还是做成日志实现框架自己本身的配置文件


2. 遗留问题

在开发中我们开发的系统所用到的日志可能是slf4j+logback,但是系统所依赖的框架,如spring依赖commons-logging、hibernate依赖jboss-logging、和别的框架依赖别的日志,这样所有的日志都无法统一进行使用,所有我们要统一日志记录,即使是用到了别的框架也让其统一使用slf4j进行输出

2.1 如何让系统中的所有框架都统一到slf4j?

  1. 将系统中的其他日志框架先排除出去
  2. 用中间包(jcl-over-slf4j.jar、log4j-over-slf4j.jar等等)来替换原有的日志框架
  3. 导入slf4j其他的实现
    Spring Boot学习笔记05——日志_第2张图片

3. spring boot日志关系

3.1层级依赖关系

我们先创建一个新的springboot的web项目,然后在pom文件空白处中右键-Diagrams-Show Dependecies来看项目的依赖关系结构图

Spring Boot学习笔记05——日志_第3张图片
进来后,我们可以看到项目各个依赖之间的层级关系和依赖关系
Spring Boot学习笔记05——日志_第4张图片
找到spring-boot-starter-logging并双击进入,可以看到相关依赖,springboot使用这个来做日志功能

<dependency>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-loggingartifactId>
      <version>2.3.3.RELEASEversion>
      <scope>compilescope>
 dependency>
层级依赖关系

Spring Boot学习笔记05——日志_第5张图片

3.2 结论

  1. springboot底层也是使用slf4j+logback的方式进行日志记录
  2. springboot把其他日志替换成了slf4j
  3. 使用了中间替换包
    public abstract class LogFactory {
           
    	static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org		/codes.html#unsupported_operation_in_jcl_over_slf4j";
    	static LogFactory logFactory = new SLF4JLogFactory();
    

Spring Boot学习笔记05——日志_第6张图片

  1. 要引入其他框架时(spring框架用的是commons-logging),一定要把引入框架的默认日志依赖移除掉(springboot能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架时,只需把引入框架依赖的日志框架移除掉即可)

4. 使用日志

4.1 默认配置

我们先在test中设置记录器

@SpringBootTest
class LoggingApplicationTests {
     
    //记录器
    Logger logger = LoggerFactory.getLogger(getClass());

    @Test
    void contextLoads() {
     

        //日志的级别:error>warn>info>debug>trace
        //可以调整输出的日志级别,日志就会在这个级别之后的高级别生效
        logger.trace("这是trace日志...");
        logger.debug("这是debug日志...");
        //没有指定级别的话,spring boot默认使用info级别(root级别)
        logger.info("这是info日志...");
        logger.warn("这是warn日志...");
        logger.error("这是error日志...");

    }
}

启动后可以看到控制台的输出
Spring Boot学习笔记05——日志_第7张图片
可以看到,没有指定级别的话,spring boot默认使用info级别(root级别) ,如果要自己设置记录器的输出级别,只需在properties配置文件中加上配置logging.level.com.sb=trace即可
Spring Boot学习笔记05——日志_第8张图片

4.2 常规设置

我们可以在properties配置文件中对日志的输出做一些常规配置

  1. 在当前项目下生成springboot.log日志文件(无指定路径)logging.file=springboot.log,当然也可以指定完整路径,例如logging.file=D:/springboot.log在G盘下生成springboot.log日志文件
  2. 在当前项目的磁盘根路径下创建spring文件夹和里面的log文件夹,使用spring.log作为默认文件logging.path=/spring/log
  3. 在控制台输出日志的格式logging.pattern.console=%d{yyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
  4. 在指定文件中的日志输出格式logging.pattern.console=%d === {yyy-MM-dd} === [%thread] === %-5level ===%logger{50} === %msg%n
日志输出格式说明

%d:表示日期时间
%thread:表示线程名
%-5level:级别从左显示5个字符宽度
%logger{50}:表示logger名字最长50个字符,否则按照据点分割
%msg:日志消息
%n:换行符

4.3 指定配置

关于springboot日志的默认配置可以在org.springframework.boot.logging.logback中查看,那我们如果需要使用自己的日志配置的话,只需在resources文件夹中放上每个日志框架自己的配置文件logback.xml即可,这样,spring boot就不适用本身默认配置,而使用开发者放上去的日志配置文件了

Logging System Customization
Logback logback-spring.xml,logback-spring.groovyorlogback.groovy
Log4j2 log4j2-spring.xml or log4j2.xml
JDK(Java Util Logging) logging.properties

需要注意的是,如果日志配置文件的名称直接为logback.xml,则该日志配置文件会直接被日志框架进行识别,如果名称为logback-spring.xml这样带spring后缀,日志框架就不直接加载日志的配置项,由springboot解析日志配置,这样可以使用springboot的高级Profile功能

<springProfile name="staging">
	<!-- configuration to be enabled when the "staging" profile is active-->
</springProfile>

这样可以指定某段配置只在某个环境下生效,否则

no applicable action for [springProfile]

4.4 切换日志框架

可以按照slf4j的日志适配图,进行相关的切换
sfl4j+log4j的方式
<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-webartifactId>
	<exclusions>
	<exclusion>
		<artifactId>logback-classicartifactId>
		<groupId>ch.qos.1ogbackgroupId>
	exclusion>
	<exclusion>
		<artifactId>1og4j-over-s1f4jartifactId)
		>org.s1f4jgroupId>
	exclusion>
	exclusions>dependency>
<dependency>
		<groupId>org.s1f4jgroupId>
		<artifactId>s1f4j-1og4j12artifactId>
dependency>
切换到log4j2
<dependency>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-webartifactId>
	<exclusions>
	<exclusion>
		<artifactId>spring-boot-starter-loggingartifactId>
		<groupId>org.springframework.bootgroupId>
	exclusion>
	exclusions>
dependency>
<dependency>
	<groupId>org.springframework.bootgroupId>
	<artifactId>spring-boot-starter-1og4j2artifactId>
dependency>

该SpringBoot学习笔记学习自雷神前辈,是对知识点的整理和自我认识的梳理,如有不当之处,欢迎指出

你可能感兴趣的:(spring,boot,自学,java,spring,boot,log4j2,log4j)