1. 日志概述
1.1 什么是日志
我们刚开始学习编程,写一些编程题时,我们使用print输出一些数据测试自己代码,这个输出的内容就可以称为日志。日志可以用来发现和定位问题,或者根据日志来分析程序的运行过程,在Spring的学习中,也经常通过控制台打印的日志来分析和定位问题。随着项目的复杂度提升,我们对日志打印有了更高的需求,不仅仅是用来排查问题,还可以用来记录一些用户的操作记录,用于分析用户的喜好,实现这样复杂的日志就需要使用一些专门的日志框架。
1.2 日志的用途
通过前面的学习,我们知道日志主要是为了发现问题,分析问题,定位问题,但除此之外,日志还有很多用途:
- 系统监控:系统监控现在几乎是要给成熟系统的标配,我们可以通过日记录这个系统的运行状态,每个方法的响应时间,响应状态等,如果出现严重异常时能自动报警。
- 数据采集:日志还可以用于采集一些数据,如页面/广告的点击量,记录用户的点击偏好。
2. 日志的使用
Spring Boot 项目在启动时,会默认有日志输出:
我们可以看到,Spring 输出的日志信息包含了很多内容,如果我们直接使用print输出日志的话,是没有这么多信息的。这是因为,Sprint Boot使用的日志框架slf4j来输出的日志。
2.1 打印日志
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/logger")
public class LoggerController {
//使用日志工程创建日志对象,后面参数为日志的名称,
//这里传入本类的类对象,用于标识这个日志是本类输出
private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
@RequestMapping("/getLogger")
public String getLogger() {
System.out.println("直接输出日志");
//输出日志
logger.info("使用框架输出日志");
return "success";
}
}
2.2 日志框架
SLF4J不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范标准,所有的SLF4J接口都需要和具体的日志框架配合使用。就相当于SLF4J对日志实现又进行了一层封装,这种模式称为门面模式(外观模式),SLF4J默认使用的日志实现是logback。
门面模式:提供一个统一的接口,用来访问子系统中的一群接口。这里的SLF4J就相当于门面,日志的具体实现就是子系统。
如果一个项目中已经使用了logback作为日志实现,现在这个项目引入了一个第三方库,这个第三方库使用了另一个日志实现,那么你的项目也必须引入这个日志实现,但是不同日志框架的API接口和配置文件不同,如果多个日志框架要共存,那么不得不维护多套配置文件,如果要更换日志框架,应用程序将不得不修改代码,并且修改过程可能会存在一些冲突。
引入日志门面之后,应用程序和日志框架之间有了统一的API接口,此时应用程序只需要维护一套配置文件即可,且当需要更换日志实现时,也不需要更改应用程序代码。
2.3 日志格式
我们使用框架输出的日志会有很多信息,我们来解释一下这些信息的含义:
以第一行为例:
- 2024-03-31T10:52:07.099+08:00:日志输出的时间
- INFO:日志的级别
- 10096:进程ID
- [ main]:线程名
- o.s.b.w.embedded.tomcat.TomcatWebServer:日志名,通常使用源代码的类名
- Tomcat initialized with port 8080 (http):日志信息
2.4 日志级别
日志级别有以下几种:
-
TRACE:追踪信息,用于输出最详细的调试信息,通常在开发和调试阶段使用,并且应根据需要在生产环境中合理地开启或关闭。
-
DEBUG:调试信息,仅在调试时使用,可输出详细的调试信息,但在生产环境中应禁用。
-
INFO:普通信息,用于输出关键操作的信息,可帮助追踪应用程序的状态和行为。
-
WARN:警告信息,表明潜在的问题,但不会影响应用程序的正常运行,需要引起注意并及时处理。
-
ERROR:错误信息,指示出现错误,但不会导致应用程序停止,需要及时处理以保证应用程序的稳定性。
-
FATAL:致命信息,表示致命的错误,会导致应用程序无法继续运行,需要立即处理以防止进一步损害。
日志的级别从上到下依次升高。
可以通过调用不同的方法打印不同级别的日志:
@RequestMapping("/level")
public String loggerLevel() {
logger.trace("trace级别的日志");
logger.debug("debug级别的日志");
logger.info("info级别的日志");
logger.warn("warn级别的日志");
logger.error("error级别的日志");
return "success";
}
logback中将fatal级别的日志归类到了error级别,所有没有fatal级别的日志。
启动项目,访问level:
我们发现trace 和 debug级别的日志并没有出现, 这是因为我们项目的默认日志级别是INFO,所以只会输出INFO和比INFO级别更高的日志,要想输出trace和debug,我们需要设置默认日志级别:
可以在配置文件中输入:logging.level.*:日志级别 来更改默认日志级别,*代表路径,表示要对哪个路径下应用这个默认日志级别,root代表应用到整个项目
可以看到此时能正常输出DEBUG级别的日志了。
2.5 日志持久化
当我们重启项目时,之前输出的日志会被清空,有时候我们并不希望这个日志被清空,于是我们可以在配置文件中写:logging.file.name:路径+文件名.log 就可以把日志储存在指定路径的文件里。
如果只写文件名则默认把日志文件放在项目路径中
2.6 日志分割
如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割:
logging:
logback:
rollingpolicy:
max-file-size: 10KB
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i
表示日志文件大于10KB时自动分割出一个日志文件,新的日志文件名是:原日志名.时间.id(0,1,2...)
3. 更简单的日志输出
lombok框架提供了@Sl4j 注解,可以让日志输出变得更简洁:
@Slf4j
@RestController
@RequestMapping("/logger2")
public class LoggerController2 {
@RequestMapping("/level")
public String loggerLevel() {
log.trace("trace级别的日志");
log.debug("debug级别的日志");
log.info("info级别的日志");
log.warn("warn级别的日志");
log.error("error级别的日志");
return "success";
}
}
标签:输出,框架,Spring,Boot,应用程序,日志,级别,logger
From: https://blog.csdn.net/2303_78892316/article/details/137193454