1. 日志的作用
1.1 什么是日志?
Spring Boot
的日志是指在Spring Boot
应用程序中记录事件和信息的机制。就是用来查 BUG 的,可以帮助我们快速定位和解决应用程序中的问题。
它的作用:
- 帮助开发人员进行调试:当应用程序出现问题时,开发人员可以根据日志信息来追踪和定位问题。
- 了解应用程序的运行情况:日志可以记录应用程序的各种事件和信息,例如应用程序启动和关闭、HTTP请求和响应、数据库操作等。
- 维护应用程序的稳定性:通过设置适当的日志级别,可以避免过多的日志信息影响应用程序的性能。
- 遵循安全和合规要求:根据应用程序的安全和合规要求,需要记录一些特定的日志信息,例如用户登录信息、敏感操作记录等。
2. 自定义日志打印
创建一个 SpringBoot
项目后,我们点击运行,在控制台会弹出如下内容:
这些其实就是系统自带的日志。那么我们如何自定义日志呢?
2.1 获取日志对象
import org.slf4j.Logger; //必须导这个包
import org.slf4j.LoggerFactory;
@RestController
public class TestController {
//1.得到日志对象(当前类的日志),
private static final Logger log = LoggerFactory.getLogger(TestController.class);
......
......
}
复制代码
有几个注意点,第一个是日志对象Logger
的包是 slf4j
,Spring Boot
中内置了日志框架 Slf4j
,可以让开发人员使用一致的API
来调用不同的日志记录框架;第二个,一般每个类都有自己的日志文件,getLogger
方法参数推荐为当前这个类,并且这个日志文件不能轻易修改,所以是private static final
。
2.2 使对象打印日志
Logger
提供了很多的方法用来打印日志。
@ResponseBody //返回非静态页面
@Controller
public class TestController {
//1.得到日志对象(当前类的日志)
private static final Logger log = LoggerFactory.getLogger(TestController.class);
@RequestMapping("/hi")
public String Hi(){
//打印日志的方法
log.trace("我是trace");
log.debug("我是debug");
log.info("我是info");
log.warn("我是warn");
log.error("我是error");
return "Hello World!";
}
}
复制代码
我们先运行程序:
当我们访问这个方法的时候(浏览器输入路径)
会看到只有访问到这个方法后日志才会出现,这才能体现日志的作用嘛;既然都是打印日志,为什么会提供这么多的方法呢?打印出来的内容都是什么意思呢?我明明写了5个方法,为什么只打印了3个呢?后面一一来解答:
2.3 日志的格式
日志的输出格式:
3.日志的级别
为什么我明明写了5个方法,为什么只打印了3个呢?这就是与日志级别相关了。
3.1 日志级别的种类
SpringBoot
日志的级别用于控制输出日志的详细程度。
每种不同的日志等级对应一组不同的日志信息,级别越高,输出的日志信息就越详细。各种日志级别的含义如下:
- trace:微量,少许的意思,级别最低;
- debug:需要调试时候的关键信息打印;
- info:普通的打印信息(默认⽇志级别);
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
SpringBoot
中日志级别从低到高依次为:trace < debug < info < warn < error < fatal
,默认的级别是info
。
日志的输出规则:当前的级别以及比当前级别高的日志才能输出(不会输出fatal),上面的 5 种不同的方法分别对应不同的日志级别,注意,没有fatal()
方法,因为当出现fatal
级别的时候程序就会被终止。
这也就是上面写了5个方法,只打印了3个的原因。
3.2 自定义日志的级别
我们可以设置日志的级别,在SpringBoot
的配置文件application.properties
中:
# 自定义日志级别
logging.level.root=error
复制代码
现在:
上面这是对根路径设置级别,还可以分别对不同的目录进行同时设置。
# 自定义日志级别
# 对根目录设置
logging.level.root=error
# 对controller 目录设置一个级别
longing.level.com.example.demo.controller=trace
# 它们不会冲突,除了 com.example.demo.controller 下为 trace,其它地方都为error。
复制代码
默认的日志是在DemoApplication
启动类中打印出来的。
4. 日志的持久化
持久化就是把日志放在硬盘上,存储为日志文件,这一步是非常重要的。
4.1 配置文件路径
在配置文件中设置配置文件的路径:
# 设置日志文件的目录
logging.file.path=D:\\logging\\
复制代码
不用自己去创建这个路径,它会自动创建,开始运行并访问:
它会默认在目录中创建一个文件,文件里面装了你自己写的日志内容。那么问题来了,我多次访问接口方法,它会覆盖掉这里面的内容吗?
答案是不会的,它会在后面追加。
4.2 配置文件名
可以进一步精确到文件名:
# 设置日志文件的文件名,注意这里是 name 属性
logging.file.name=D:\logging\mySpring.log
复制代码
现在还有一个问题,如果程序运行时间周期很长(比如生产环境),那么日志一定是非常多的,用一个文件来存储显然不现实,那么如何让它自动地分成多个文件呢?
可以设置日志文件存储大小的最大容量。
# 设置日志大小的最大大小 1KB(一般不会这么小,这里用于演示)
logging.logback.rollingpolicy.max-file-size=1KB
复制代码
这个配置项用于指定一个日志文件的最大大小,支持的单位包括 KB
、MB
、GB
等。,当日志文件达到指定大小后,将自动创建一个新的日志文件来继续记录日志信息,我以上面的代码为例,我经过多次请求后:
5. 借助 lombok 输出日志
lombok
是一个框架,它能帮我们写get、set
等方法,非常方便。
用 lombok
输出日志其实非常简单,就是加一个注解:
@Controller
@ResponseBody
@Slf4j //加上这个注解,它会自己生成一个日志对象,对象名叫“log”,直接引用。
public class LogController {
@RequestMapping("/hi")
public String hi(){
log.trace("我是trace");
log.debug("我是debug");
log.info("我是info");
log.warn("我是warn");
log.error("我是error");
return "Hello World!";
}
}
复制代码