一、日志框架的了解
- 市面上的日志框架。分为日志门面和日志实现。
- Spring框架默认使用的JCL(也就是commons-logging)
- Spring Boot选用SLF4j和logback。
- JCL 最后更新在2014年,之后就没有更新了。所以现在主要使用SLF4J来打印日志
- log4j、logback、slf4j都是一个人写的。log4j存在缺陷所以有了logback。后来发现该有一个接口规范来定义,所以有了日志门面slf4j
- log4j2是Apache公司仿的log4j
| 日志门面 (日志的抽象层) | 日志实现 |
|---|---|
| JCL(Jakarta Commons Logging 2014年后不再更新) SLF4j(Simple Logging Facade for Java) jboss-logging | Log4j JUL(java.util.logging) Log4j2 Logback |
二、 SLF4j的使用 官网:https://www.slf4j.org
1、如何在系统中使用SLF4j
开发的时候日志记录方法的调用,不应该直接调用日志的实现类,而是调用日志门面的方法。
导入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");
}
}
每一个日志的实现框架都有自己的配置文件,使用slf4j后,配置文件还是 日志实现jar 本身的配置文件(日志门面只是一个接口,具体日志配置文件还是日志实现的配置文件)。
图示(在官网中找到这张图):只要日志门面,没有日志实现输出为null; Spring Boot选用SLF4j日志门面和logback日志实现。

2、遗留问题
以前的系统并不是使用的SLF4j和logback日志架构,如Spring(commons-logging)、Hibernate(jboss-logging) 等框架如何统一使用slf4j进行日志输出呢?解决办法如:图示(在官网中找到这张图)

- 如何让系统中所有的日志都统一到slf4j?
- 1、将系统中其他日志框架先排除出去;--先踢掉旧jar
- 2、用中间包(图中的框架转换包)来替换原先的日志框架;--偷梁换柱包
- 3、导入slf4j及其实现 。
3、 Spring Boot的日志关系
以图示方式显示Spring Boot的底层依赖关系 :右键--》Diagrams--》show dependencies
可以看到spring-boot-starter是一个基本依赖,spring-boot-starter--》spring-boot-starter-logging(SpringBoot使用它来做日志功能 )


- 总结:
- 1、SpringBoot底层使用slf4j+logback的方式来进行日志记录
- 2、 SpringBoot把其他日志都替换成了slf4j,使用中间替换包

- 3、如何引入其他日志框架呢?一定要把框架默认的日志依赖移除。比如Spring框架使用的是commons-logging,Spring Boot是怎么做的呢?在底层依赖关系上找到spring-boot-starter-logging,双击,可以看到移除了commons-logging依赖。

- 4、Spring Boot能自动适配所有的日志,底层使用slf4j+logback的方式来进行日志记录。如果要引入其他日志框架,只需要把默认依赖的日志框架排除,再引入新的日志依赖即可。
4、 Spring Boot的日志使用
1)、默认配置
Spring Boot默认帮我们配置好了日志:
// 记录器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
void contextLoads() {
//日志的级别;
//由低到高 trace<debug<info<warn<error
//可以调整输出的日志级别;日志就只会在这个级别以后的高级别生效
logger.trace("这是trace日志...");
logger.debug("这是debug日志...");
//SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别
logger.info("这是info日志...");
logger.warn("这是warn日志...");
logger.error("这是error日志...");
}
默认的日志格式:${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}
日志输出格式:
%d表示日期时间,
%thread表示线程名,线程id
%-5level:级别从左显示5个字符宽度,-5是靠左对齐
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
在哪里看配置:logback下面的defaults.xml、file.appender.xml等文件。意思是:超过10M之后,自动生成log2、log3等文件


2)、如何修改SpringBoot的日志默认配置

| logging.file.name | logging.file.path | Example | Description |
|---|---|---|---|
| (none) | (none) | 只在控制台输出(默认) | |
| 指定文件名 | (none) | my.log | 输出日志到my.log文件 |
| (none) | 指定目录 | /var/log | 输出到指定目录的 spring.log 文件中 |
3)、指定配置文件
如果我们想自己写日志的配置文件,可以命名为logback-spring.xml或logback.xml,推荐命名为logback-spring.xml
| Logging System | Customization(直接用以下文件命名,框架自动加载.优先级比application.properties高) |
|---|---|
| Logback | logback-spring.xml, logback-spring.groovy, logback.xml or logback.groovy |
| Log4j2 | log4j2-spring.xml or log4j2.xml |
| JDK (Java Util Logging) | logging.properties |
- logback.xml :直接被日志框架识别(而不是Spring Boot框架,不识别不处理)。
---如果使用logback.xml作为日志配置文件,还要使用profile功能,会有以下错误:no applicable action for [springProfile] - logback-spring.xml:由SpringBoot解析日志配置,可以使用Spring Boot的高级Profile功能。
<springProfile name="staging"> <!-- configuration to be enabled when the "staging" profile is active --> 可以指定某段配置只在某个环境下生效 </springProfile> 如:在dev环境下和非dev环境下的不同输出 <springProfile name="dev"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n</pattern> </springProfile> <springProfile name="!dev"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%n</pattern> </springProfile>5、切换日志框架
可以按照slf4j的日志适配图,进行日志框架的切换。
(1)转成slf4j+log4j的形式(并不推荐,logback是log4j的升级):①先移除

②可以看到如图被移除了;

③再添加slf4j-log4j12的依赖即可。


(2)Spring Boot也支持slf4j+log4j2的starter。切换也很简单,①排除依赖spring-boot-starter-logging;②添加依赖spring-boot-starter-log4j2




本文介绍市面上常见的日志框架,包括日志门面和日志实现的区别,并重点讲解SLF4j与logback的使用方法。此外,还介绍了如何在SpringBoot项目中统一日志输出并配置日志。
1万+

被折叠的 条评论
为什么被折叠?



