Spring Boot可以使用很多日志框架,本文将使用slf4j框架
解读日志
我们来看一个日志:
2024-02-25T15:01:11.515+08:00 INFO 3272 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port 8080 (http) with context path ''
- 2024-02-25T15:01:11.515+08:00 时间,这里表示2024年2月25日15时01分11秒515毫秒,东八区时区(UTC+8)
- INFO 日志级别,这在后面会讲到
- 3272 当前进程的PID
- --- 分隔号
- main 打印日志的线程名称
- o.s.b.w.embedded.tomcat.TomcatWebServer 打印日志的类,其中o.s.b.w是简写
- Tomcat started on port 8080 (http) with context path '' 具体的日志信息
日志级别
日志从优先级高到低分为如下几个级别:
- ERROR:错误
- WARN:警告
- INFO:信息
- DEBUG:调试
- TRACE:追踪
不同日志的重要性不同,因此在不同的项目阶段,希望保留的日志也不同。如开发者需要保留全部日志,而维护者只需要保留INFO以上的日志。
我们可以在application.properties配置文件内更改需要保留的优先级:
logging.level.[完整的包名或类名]=级别
Spring Boot默认只打印INFO级别的日志
打印日志
创建日志对象
打印日志,需要先创建一个日志对象。可以采用如下代码创建日志对象:
import org.slf4j.LoggerFactory
class XXX{
companion object{
private val log = LoggerFactory.getLogger(XXX::class.java)
}
}
注意,Spring Boot中有很多LoggerFactory。需要导入的是org.slf4j.LoggerFactory。
其中,companion object相当于Java中的static关键字,表示log对象只会被创建一次,防止在实例化时创建新的日志对象,同时,使用private val修饰log变量,使其不能被其他类访问或被任何类修改
另外,getLogger还可以传入一个字符串。以下是使用Class和使用字符串打印出来的日志的区别:
可以看到,传入Class的日志对象打印出来了包名和类名;而传入字符串的日志对象只打印出了传入的字符串
使用日志对象
一个日志对象有如下方法:
- error 打印错误日志
- warn 打印警告日志
- info 打印信息日志
- debug 打印调试日志
- trace 打印追踪日志
实践一下:
创建TestController类:
package com.example.c0101.controller
import org.slf4j.LoggerFactory
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
class TestController {
companion object{
private val log = LoggerFactory.getLogger(TestController::class.java)
}
@RequestMapping
fun index(): String{
log.error("This is an error")
log.warn("This is a warning")
log.info("This is a info")
log.debug("This is for debug")
log.trace("This is for trace")
return "Hello World"
}
}
访问http://127.0.0.1:8080,控制台输出如下:
成功打印了不同级别的日志。为什么没打印debug和trace呢?因为Spring Boot默认的日志等级为INFO,可以通过前文的方法修改日志等级
保存日志
保存到指定路径
可以修改配置文件的logging.file.path保存日志到指定路径,如:
logging.file.path=logs
表示将日志保存到当前项目的logs文件夹内:
保存到指定文件
可以修改配置文件的logging.file.name保存日志到指定文件,如:
logging.file.name=logs.log
表示将日志保存到当前项目的logs.log文件内:
设置日志文件的保存天数
可以修改配置文件中的logging.logback.rollingpolicy.max-history设置保存天数,如:
logging.logback.rollingpolicy.max-history=7
表示设置保存天数为7天,会自动删除超过7天的日志文件
设置日志文件的容量上限
可以修改配置文件中的logging.logback.rollingpolicy.max-file-size设置日志文件的容量,如果超过了容量,则打包为压缩包文件,如:
logging.logback.rollingpolicy.max-file-size=7KB
表示设置容量上限为7KB,超过上限则打包成压缩包