前言: 这是我第一次仔细研究 Spring Boot 相关的知识, 就拿日志下手了, 欢迎大家指点
Spring Boot 日志关系
这个是 Spring Boot 的启动器, 我们点击 spring-boot-starter
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
这个 spring-boot-starter-logging 就是 Spring Boot 用来做日志功能的
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-logging</artifactId>
- </dependency>
底层依赖关系
通过这张图我们能总结出
Spring Boot 底层也是使用 slf4j+logback 的方式进行日志记录
Spring Boot 也把其他的日志都替换成了 slf4j;
那么 Spring Boot 是如何将这些日志都替换成 slf4j 的呢? 我们找到其中的一个 jcl-over-slf4j
我们可以看到里面有个 commons.logging, 里面实现的正是 SLF4JLogFactory
- @SuppressWarnings("rawtypes")
- public abstract class LogFactory {
- static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
- static LogFactory logFactory = new SLF4JLogFactory();
那么我们如果要引入其它框架, 一定要把这个框架的默认日志依赖移除掉.
Spring Boot 用的是 commons-logging
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <exclusions>
- <exclusion>
- <groupId>commons-logging</groupId>
- <artifactId>commons-logging</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
SpringBoot 能自动适配所有的日志, 而且底层使用 slf4j+logback 的方式记录日志, 引入其他框架的时候, 只需要把这个框架依赖的日志框架排除掉即可;
日志使用
默认配置
Spring Boot 默认帮我们配置好了日志; 日志有五种级别, 由低到高是 trace<debug<info<warn<error, 可以调整输出的日志级别; 日志就只会在这个级别及以后的高级别生效, Spring Boot 默认给我们使用的是 info 级别的, 没有指定级别的就用 SpringBoot 默认规定的级别; root 级别
为什么也叫 root 级别呢, 依次点击文件目录下的这些文件
- graph LR
- A[External Libraries]-->B[springframework.boot.spring-boot]
- B-->C[org]
- C-->D[springframework]
- D-->E[boot]
- E-->F[logging]
- F-->G[logback]
- G-->H[base.xml]
从图中我们能看出, Spring Boot 有个默认标签 < root > 里面指定的级别正是 INFO, 这也就是为什么默认级别叫 root 级别, 作为一个小知识点给大家扩展了一下, 下面进入正题, 我们在测试类中写下以下代码.
- // 记录器
- Logger logger = LoggerFactory.getLogger(getClass());
- @Test
- public void contextLoads() {
- logger.trace("这是 trace 日志...");
- logger.debug("这是 debug 日志...");
- //SpringBoot 默认给我们使用的是 info 级别的, 没有指定级别的就用 SpringBoot 默认规定的级别; root 级别
- logger.info("这是 info 日志...");
- logger.warn("这是 warn 日志...");
- logger.error("这是 error 日志...");
- }
现在我们启动这个测试类
可以看出只打印出了 info 及以后的日志记录, 也印证了前面所说的
修改默认配置
接下来我们来修改 Spring Boot 的默认配置
修改默认级别
输出日志文件
修改打印格式
以下代码均在 application.properties 文件中写入
修改默认级别
logging.level.com.atguigu=trace
这行代码指定了 Spring Boot 会输出 trace 及以后级别的日志记录, level 以后的路径是当前项目的路径
输出日志文件
输出日志有两种方法
- logging.file
- logging.path
- logging.file
输出指定文件名的日志, 通过这个我们可以指定输出的日志文件名的名称
logging.file=f:/springlog/springboot.log
我们会在这个路径下生成一个叫 springboot.log 的日志, 如果没有指定路径, 会在当前项目下生成 springboot.log 日志
logging.path
在 f 盘下创建 springlogpath 文件夹和里面的 log 文件; 使用 spring.log 作为默认文件
logging.path=f:/springlogpath
logging.file | logging.path | Example | Description |
---|---|---|---|
(none) | (none) | 只在控制台输出 | |
指定文件名 | (none) | my.log | 输出日志到 my.log 文件 |
(none) | 指定目录 | /var/log | 输出到指定目录的 spring.log 文件中 |
如果都不指定, 默认只在控制台输出, 如果同时指定, 只有 logging.file 生效
修改打印格式
我们可以自定义日志输入的格式同样有两种方法
- logging.pattern.console
- logging.pattern.file
- logging.pattern.console
修改控制台输出日志格式
logging.pattern.console=%d{yyyy-MM-dd} ----> [%thread] ----> %-5level---> %logger{50} ---> %msg%n
我们用 ----> 的方式来作为控制台打印日志的连接
如我们所预期的一样, 每个 log 中都是用的 ----> 来连接的
logging.pattern.file
修改指定文件中输出日志的格式
logging.pattern.file=%d{yyyy-MM-dd} === [%thread] === %-5level === %logger{50} ==== %msg%n
日志文件里我们用 === 来作为连接看效果
日志输出格式:
%d 表示日期时间,
%thread 表示线程名,
%-5level: 级别从左显示 5 个字符宽度
%logger{50} 表示 logger 名字最长 50 个字符, 否则按照句点分割.
%msg: 日志消息,
%n 是换行符
- -->
- %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
这个就是日志输出的格式, 大家可以照着这个来自定义自己的日志
指定配置
我们可以给类路径下放上每个日志框架自己的配置文件; SpringBoot 就不使用他默认配置的了
Logging System | Customization |
---|---|
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-spring.xml 来扩展高级功能
如果我们放的是 logback-spring.xml 日志框架就不能识别配置文件从而直接加载日志的配置项, 由 Spring Boot 解析日志配置, 我们可以使用 Spring Boot 的高级 Profile 功能
- <springProfile name="dev">
- <!-- configuration to be enabled when the "staging" profile is active -->
可以指定某段配置只在某个环境下生效
</springProfile>
在配置文件中加上这个标签就可以某段配置只在指定环境下生效, 比如这段代码就会在 dev 环境下才生效
切换日志框架
我们可以在 Spring Boot 官网找到这张图片
如果我们想使用 log4j, 那么我们需要导入 log4j 一系列的所有包. slf4j-API,slf4j-log4j12,log4j
Spring Boot 日志使用到这就到达尾声了, 如果有说的不对的地方还望指出, 一起进步.
来源: https://www.cnblogs.com/zouwangblog/p/11198915.html