大家好,我是一只爱打拳的程序猿,今天我给大家带来的是 SpringBoot 日志文件的讲解。日志在我们日常编程中尤为重要。如果没有日志,当我们程序出现错误时,我们很难查找到错误从而进行修改。但有了日志后,我们就能通过日志发现错误并精确错误位置及时补救。
目录
1. 什么是日志
在我们学习语法阶段时,当满足某一个条件时,我们通常会使用 sout 即 System.out.println 来输出一句话来作为日志。如执行了某某方法或满足某某条件。
System.out.println("执行了某某方法");
而在 SpringBoot 中,我们有了更为高级日志文件。 当我们执行 SpringBoot 项目时,控制台输出的就是一些默认的日志。
记录了某个程序的执行时间、执行的日志级别(是否正常)以及线程名等等。如下图所示。
因此,当你的程序出现错误的时候,你能通过类似上述的日志来精确的查找错误并进行修改。此外出了发现错误和定位错误之外,当你的网站崩溃时正好有人在你的网站上注册账号,此时也返回一个注册成功信息给这个用户,后面你通过该日志也能手动的补录他所注册的账号。可见 SpringBoot 日志是比较重要的。
下面我来更加详细的讲解 SpringBoot 日志的用法以及如何配置。
2. 日志的用法
2.1 日志的级别
日志的级别:
- TRACE:这是最低级别的日志记录,用于输出最详细的调试信息。通常用于开发调试阶段,但在生产环境中应关闭以避免输出过多无用信息。
- DEBUG:用于输出程序中的调试信息,通常在开发过程中使用。生产环境中也应关闭以减少日志量。
- INFO:用于输出程序正常运行时的一些关键信息,如程序启动、运行日志等。在生产环境中通常开启此级别的日志记录。
- WARN:用于输出警告信息,提示程序可能会出现一些异常或错误。主要用于记录一些非致命性异常信息,以便及时发现并处理问题。
- ERROR:用于输出程序运行时的错误信息,通常表示程序出现了不可预料的错误。用于记录一些致命性异常信息,以便及时发现并处理这些问题。
- FATAL:表示程序出现了严重错误,通常会导致应用程序崩溃或无法继续运行。这是比ERROR更严重的级别。
2.2 使用日志
使用日志我们通过 Logger logger = LoggerFactory.getLogger(类名); 来进行使用,如下列代码。Logger 应用 org.slf4j 包下的。
@RestController
public class LogController {
// 得到日志对象
private static Logger logger = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/logger")
public void logger() {
String msg = "日志";
// 按照从低到高的顺序打印日志级别
logger.trace("trace 的" + msg);
logger.debug("debug 的" + msg);
logger.info("info 的" + msg);
logger.warn("warn 的" + msg);
logger.error("error 的" + msg);
}
}
当在浏览器中输入 localhost:8080/logger 时,浏览器没有任何显但控制台输出了相应的日志。我们仔细观察只输出了 info、warn、error,前面的 trace 和 debug 没有输出,如下图所示。
在 SpringBoot 中,系统只会输出等于或者大于当前日志的级别。默认的日志级别是 info,这意味着只有 info、warn、error 级别的日志会被打印,而 trace和 debug 级别的日志则不会被显示。
2.3 自定义日志级别
假设我们将每一种日志都进行统计的话,如默认的 info 日志,这样我们每天将会得到无数的记录,因此我们可以通过 logging.level.来设置级别。level.后面的就是你想设置的范围,如想将整个项目默认级别进行设置则用 logging.level.root 。
如在 application.properties 配置文件中设置当前的默认日志级别为 warn 。使用 logging.level.root=warn 来更改设置当前日志的默认级别。
再次执行 localhost:8080/logger 得到的自然是 warn 和 error 了
此外,我们也可以特定为某一个文件设置,如将 com.example.demo 即 demo 文件设置为 debug。
为什么SpringBoot能打印日志和设置日志级别?
解释:SpringBoot 内置了两个框架 SLF4J 和 LogBack ,其中 LogBack 是 SpringBoot 底层实现日志的基本框架,而 SLF4J 则是我们程序猿能够直接使用的。就想我们外出吃饭,LogBack 是我们的服务员,SLF4J 比作老板。当服务员服务不到位时,我们直接叫老板换一个服务员。
3. 日志的持久化
上述的我们所打印的日志,只能在控制台黑框框中输出,当我们关闭编译器后这些日志就全部消失了。因此,我们可以将这些日志保存到磁盘(本地电脑等存储介质)中,这样就能保证日志的持久化。
3.1 将日志存入磁盘
在配置文件中使用 logging.file.path="存放路径" 即可,如将上文中的日志存放到 D 盘的 test 文件夹底下,我们只需要输入以下代码即可。
logging.file.path=D:\\test
3.2 配置日志文件名
此外,我们也可以给存入磁盘的日志文件起名,只需要在路径后面加上要起的名即可。如下代码:
logging.file.path=D:\\test\\MyLog
4. Lombok的使用
4.1 idea下载Lombok
更加简单使用日志,即使用 Lombok 插件,我们可以在 File->Settings->Plugins 中搜索 Lombok 下载即可。
然后在 pom.xml 文件中,添加 Lombok 的框架的框架支持。你可以在 SpringBoot 项目创建时候添加,也可以通过 EditStarters 来进行添加。
此时,pom.xml 文件中应多入以下代码:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
4.2 使用方法
直接在方法上方加入 @Slf4j 注解如下代码所示:
@RestController
@Slf4j
public class LogController {
@RequestMapping("/logger")
public void logger() {
String msg = "日志";
// 按照从低到高的顺序打印日志级别
log. trace("trace 的" + msg);
log.debug("debug 的" + msg);
log.info("info 的" + msg);
log.warn("warn 的" + msg);
log.error("error 的" + msg);
}
}
我们可以看到 @Slf4j 来源于 lombok。
4.3 Lombok运行原理
Lombok的运行原理主要基于编译器插件和注解处理。Lombok通过在编译期间对源代码进行操作,自动生成所需的代码片段,从而减少开发人员需要编写的冗余代码。
Lombok的工作流程
- 初始化插入注解处理器:Lombok作为一个注解处理器,在编译过程中初始化并准备处理注解。
- 解析与填充符号表过程:编译器对源代码进行词法分析和语法分析,构建抽象语法树(AST),并填充符号表。
- 插入式注解处理器的注解处理过程:Lombok处理器根据注解信息,对AST进行操作,添加或修改节点。
- 分析与字节码生成过程:对语法进行静态检查,进行数据流和控制流分析,还原简化代码的“语法糖”,最终生成字节码。
Lombok的实现机制
Lombok通过注解处理来实现其功能。它使用Java的注解处理器API,在编译时对源代码的AST进行操作。Lombok提供的注解如
@Data
、@Builder
、@Setter
、@Getter
等,都是在编译过程中被处理,生成相应的代码片段。例如,@Data
注解会在类上自动生成getter、setter、equals、hashCode和toString方法。
当我们添加 @Slfj 后,实际上在 target 文件夹底下,会自动生成一行类代码 LoggerFactory 代码。 此外,大家可以尝试 @Setter、@Getter、@Data等注解。
本篇博客到这里就结束了,感谢各位的观看。