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后,配置文件要根据实现框架来进行编写。
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格式管理的了。
3.Spring Boot日志关系
打开pom.xml配置文件,右键,选择Diagrams里的Show Dependencies,即可查看到项目的依赖关系。
观察上图,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日志适配图,如果需要切换为其他的日志框架,需要将某些依赖排除掉,加入日志框架的依赖。