SpringBoot学习笔记-日志
Table of Contents
1 SpringBoot与日志
1.1 常见的日志框架
- JUL: java.util.logging
- JCL: Jakarta Commons Logging
- JBoss-logging
- logback
- log4j
- log4j2
- slf4j: Simpe Logging Facade for java
日志的抽象层 | 日志实现 |
---|---|
JCL,SLF4j,jboss-logging | Log4j, JUL, Log4j2, Logback |
- 最常用的日志抽象层选择: SLF4j
- 日志实现选择: Logback
- SpringBoot底层是Spring框架, Spring框架默认使用JCL.
- SpringBoot选用SLF4j和Logback
1.2 SLF4j使用
1.2.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"); } }
- 图示
1.2.2 遗留问题
- 不同框架集成时, 不同的框架可能使用了不同的日志框架, 需要统一日志记录.
- 将其他框架中其他日志框架先排除出去
- 用适配包替换原来的日志接口包
- 使用slf4j其他的实现
- 图示
1.3 SpringBoot日志关系
- SpringBoot底层也是使用
slf4j
+logback
的方式进行日志记录. - SpringBoot也把其他的日志接口层替换成了slf4j接口层.
public abstract class LogFactory { static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j"; // 把工厂类换成了SLF4J工厂类 static LogFactory logFactory = new SLF4JLogFactory(); }
- 如果我们要引入其他框架,一定要把这个框架的默认日志依赖移除掉.以下是SpringBoot的用法.
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
- SpringBoot底层日志依赖关系图
1.4 SpringBoot日志使用
- 使用日志测试代码
package com.devinkin.springboot; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class SpringBoot03LoggingApplicationTests { // 日志记录器 private Logger logger = LoggerFactory.getLogger(getClass()); @Test public void contextLoads() { // System.out.println(); // 日志的级别:由低到高 // trace<debug<info<warn<error // 可以调整需要输出的日志级别: 日志就只会在这个级别及以后的高级别生效 logger.trace("这是trace日志..."); logger.debug("这是debug日志..."); // SpringBoot默认使用的是info级别的, 没有指定级别的就使用SpringBoot默认规定的级别 logger.info("这是info日志..."); logger.warn("这是warn日志..."); logger.error("这是error日志..."); } }
- 设置日志的级别:
logging.level
logging: level: com.devinkin: trace
- 指定日志的文件名:
logging.file
,会在当前项目下生成springboot.log日志
logging: file: springboot.log
- 指定日志的文件的目录:
logging.path
, 日志文件名称使用SpringBoot默认的输出日志文件名.- 如果同时指定了
logging.file
, 则使用logging.file
, 不会使用logging.path
- 如果同时指定了
logging: path: /home/devinkin/JavaCode/WebBackEnd/SpringBoot/spring-boot-03-logging/log
- 指定日志在控制台输出的格式:
logging.pattern.console
logging: console: "%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"
- 指定文件中日志输出的格式:
logging.pattern.file
logging: file: "%d{yyyy-MM-dd HH:mm:ss.SSS} === [%thread] === %-5level === %logger{50} === %msg%n"
- 日志的输出格式
符号 | 含义 |
---|---|
%d | 表示日期时间 |
%thread | 表示线程名 |
%-5level | 表示logger名字最长50字符,否则按照句点分割 |
%msg | 日志消息 |
%n | 换行符 |
1.5 SpringBoot指定日志文件的配置
- 在类路径下放每个日志框架自己的配置文件即可, SpringBoot就不使用它默认日志配置文件
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 |
- 带spring后缀名, 日志框架就会被SpringBoot加载, 就能使用SpringBoot的高级功能.
<springProfile>
- 在开发环境下的输出格式和非开发环境下的输出格式
<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>
- 设置SpringBoot为开发环境下运行
spring: profiles: active: dev
1.6 SpringBoot切换日志框架
- 可以按照slf4j的日志适配图,进行相关的切换
- 使用
slf4j + log4j
的方式
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>logback-classic</artifactId> <groupId>ch.qos.logback</groupId> </exclusion> <exclusion> <artifactId>log4j-over-slf4j</artifactId> <groupId>org.slf4j</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
- 切换为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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>