0
点赞
收藏
分享

微信扫一扫

Spring Boot笔记-Spring Boot与日志(三)


1.日志框架

市面上常见的框架:JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j……

日志门面(日志抽象层)

日志实现

JCL(Jakarta Commons Logging)、SLF4J(Simple Logging Facade for Java)、jboss-logging

Log4j JUL(java.util.logging)、Log4j2、Logback

在使用的是,在左边选一个抽象层,右边选一个实现。日志门面建议选择SLF4J,日志实现建议选择Logback。

Spring Boot选用的是SLF4J和Logback。

2.SLF4J使用

1.如何在系统中使用SLF4J

在开发的时候,日志记录方法的调用,不应该调用日志的实现类的方法,而应该调用日志抽象层的方法,由实现类具体实现。

在SLF4J官网用户手册:http://www.slf4j.org/manual.html里,可以找到下图。草绿色是应用系统层面,浅蓝色的是抽象层,深蓝色和灰色是具体实现,深绿色的是抽象层和实现类中间的适配器。

于是,我们需要导入SLF4J.jar和Logback.jar。每一个日志的实现框架都有自己的配置文件,在使用SLF4J后,配置文件要根据实现框架来进行编写。

Spring Boot笔记-Spring Boot与日志(三)_spring

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");
    }
}

2.遗留问题

对于一个系统,可以使用了多个框架,每个框架有自己的日志输出,现在希望统一使用SLF4J进行日志输出,应该怎么做呢?

打开SLF4J关于遗漏问题的介绍:http://www.slf4j.org/legacy.html。

具体的实现方法是:将系统中其他日志框架先排除出去,用中间包替换原有的日志框架,导入SLF4J其他的实现。

举个例子,看下图的左上角部分,应用中使用了一些框架,这些框架内部分别用了Commons logging、log4j、java.util.logging。需要将框架中的jar包排除出去,分别使用jcl-over-slf4j.jar、log4j-over-slf4j.jar、jul-to-slf4j.jar作为原有jar包的替换包。这些jar包中,包含原有jar包中的东西,并在其基础上封装了一层,以满足SLF4J的格式。这时候,应用中的日志信息就统一成了SLF4J格式管理的了。

Spring Boot笔记-Spring Boot与日志(三)_xml_02

3.Spring Boot日志关系

打开pom.xml配置文件,右键,选择Diagrams里的Show Dependencies,即可查看到项目的依赖关系。

Spring Boot笔记-Spring Boot与日志(三)_spring_03

观察上图,Spring Boot底层使用的就是SLF4J和Logback,中间方框的内容似曾相识,就是打通其他日志框架和SLF4J的中间层,即中间替换包。如果要引入其他框架,需要把这个框架的默认日志依赖排除掉,即在pom.xml文件中使用exclusion将其排除掉。

4.日志使用

1.默认配置

Spring Boot默认帮我们做好了日志配置。

package com.atguigu.springboot;

import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class SpringBoot03LoggingApplicationTests {
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    void contextLoads() {
        // 日志级别由低到高:trace < debug < info < warn < error
        logger.trace("trace");
        logger.debug("debug");
        // Spring Boot默认按照info级别打印日志
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
    }
}

Spring Boot修改日志的默认设置,可以通过配置文件,不同版本的Spring Boot可能略有不同。

# 指定日志按照trace级别输出
logging.level.com.atguigu=trace
# 指定日志名称,输出到项目根路径下的spring-boot.log文件中
logging.file.name=spring-boot.log
# 指定日志存放位置,输出到指定目录的spring.log文件中
logging.file.path=/var/log
# 指定控制台中日志的格式
logging.pattern.console=%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日志的格式
logging.pattern.file=%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n

关于日志格式的解释:

%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
日志输出格式:
%d表示日期时间
%thread表示线程名
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割
%msg:日志消息
%n是换行符

2.指定配置

当我们在类路径下放上每个框架自己的配置文件,Spring Boot就不走默认的配置了。

Logging System

Customization

Logback

logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy

Log4j2

log4j2-spring.xml,log4j2.xml

JDK(Java Util Logging)

logging.properties

当配置文件为logback.xml时候,配置文件会被日志框架识别到。

当配置文件为logback-spring.xml时候,配置文件会被Spring Boot识别到,此时可以使用Spring Boot的高级Profile功能:https://docs.spring.io/spring-boot/docs/2.2.6.RELEASE/reference/htmlsingle/#boot-features-logging。

在logback-spring.xml中,可以指定某个配置,在某个环境下生效。如果需要激活某个环境,可以在配置文件中写明,也可以在启动参数中标明,如:--spring.profile.active=dev。

<springProfile name="dev">
    <!‐‐ configuration to be enabled when the "dev" profile is active ‐‐>
    <pattern>%d{yyyy‐MM‐dd HH:mm:ss.SSS} ‐‐‐‐> [%thread] ‐‐‐> %‐5level %logger{50} ‐ %msg%n</pattern>
</springProfile>

注意,这个高级功能,必须在logback-spring.xml配置文件中使用,如果在logback.xml中使用会报错。

5.切换日志框架

根据SLF4J日志适配图,如果需要切换为其他的日志框架,需要将某些依赖排除掉,加入日志框架的依赖。

举报

相关推荐

0 条评论