springboot 底层是spring框架,spring框架默认使用JCL
springboot选用slf4j和logback
jcl、slf4j:日志门面
log4j、log4j2、logback:日志实现
log4j、logback、slf4j是一个人写的,logback > log4j
log4j2 是apache的
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,无法使用
- 使用slf4j和logback的实现
- log4j比slf4j要早,所以使用log4j需要一个slf4j和log4j的适配层,实现了slf4j的方法,真实调用的是log4j的方法
- …
使用slf4j后,配置文件使用实现类的配置文件
遗留问题:
我们在写项目的时候,使用了slf4j+logback作为日志框架。但我们在项目中使用了其他> 功能框架:Spring(commons-logging)、Hiberate(jboss-logging)、Mybatis等,其他框》架使用了不同的日志框架
统一到slf4j:
将系统中其他日志框架排除,用中间件替换原有的日志框架,导入slf4j的其他实现
- jcl-over-slf4j.jar 替换commons-logging.jar
- log4j-over-slf4j.jar 替换 log4j.jar
- jul-to-slf4j.jar
2. Spring Boot日志
idea中查看依赖关系(2.1.3.RELEASE)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.1.3.RELEASE</version>
<scope>compile</scope>
</dependency>
springboot使用slf4j+logback方式进行日志记录
springboot也把其他日志替换成了slf4j
如果我们引入了其他框架,一定要把其他框架默认的日志依赖移除掉
springboot能自动适配所有的日志,而底层是使用slf4j+logback的方式记录日志引入其他框架把这个框架依赖的日志框架排除掉
3. 日志使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
public static void main(String[] args) {
SpringApplication.run(StartApplication.class, args);
Logger logger = LoggerFactory.getLogger(StartApplication.class);
}
3.1 日志级别:
trace、debug、info、warn、error
没有设置级别,使用springboot默认级别:root级别
3.2 基础配置
logging.level.xxx=debug
#当前项目下生成springbppt.log日志
#可以指定完整路径 = D:/springboot.log
logging-file=springboot.log
#在当前磁盘根路径下创建爱你spring/log文件夹,使用spring.log作为默认文件
logging-path=spring/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} === {%thread} %-5level === %logger(50) === %msg%n
3.3 日志输出格式
- %d 表示日期时间
- %-5level 级别从左显示5个字符宽度
- %logger(50) 表示logger名字最长50个字符,否则按照句点分割
- %msg 日志消息
- %n 换行符
%d{yyyy-MM-dd HH:mm:ss.SSS} {%thread} %-5level %logger(50) -%msg%n
3.4 默认日志配置文件
E:\apache-maven-3.5.0\repo\org\springframework\boot\spring-boot\2.1.3.RELEASE\spring-boot-2.1.3.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml
自定义配置文件
logback.xml:直接被日志框架识别
logback-spring
.xml:由springboot解析日志配置,可以使用springboot高级功能
<!--指定配置只在某个环境下生效-->
<springProfile name="staging">
<!-- configuration to be enabled when the "staging" profile is active -->
</springProfile>
<springProfile name="dev | staging">
<!-- configuration to be enabled when the "dev" or "staging" profiles are active -->
</springProfile>
<springProfile name="!production">
<!-- configuration to be enabled when the "production" profile is not active -->
</springProfile>
3.5 切换日志框架
按照slf4j适配图进行切换
logback 转为log4j为例:
移除logback依赖,去除log4j-over-slf4j适配层依赖(适配层是将调用log4j转为调用slf4j,slf4j再调用自己的实现来实现日志框架统一)加入slf-log4j12依赖(自带log4j依赖)
logback转为log4j2:
排除spring-boot-starter-logging ,加入 spring-boot-starter-log4j2
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>