作者
:学Java的冬瓜
博客主页
:?冬瓜的主页🌙
专栏
:【Framework】
主要内容
:使用Logger对象打印日志,利用注解更简单的打印SpringBoot日志。日志级别的设置。日志的持久化存储。
作用A: 记录错误日志和警告日志(发现或定位问题)
作用B: 记录用户登录日志,方便判断用户是正常登录还是恶意登录操作。
作用C: 记录系统的操作日志,方便恢复数据和定位操作人。
SpringBoot日志使用了门面模式,内置了SLF4J和LogBack,SLF4J使得开发人员可以使用统一的接口,而不需要关心日志具体的实现。LogBack就是日志的具体实现。如下图:
代码:
package com.example.demo.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@ResponseBody
//等价于RestController
@RequestMapping("/test")
public class TestController {
//注意:选择slf4j类型的Logger定义
private static final Logger log =LoggerFactory.getLogger(TestController.class);
@RequestMapping("/active")
public String active(){
System.out.println("==================================");
log.trace("this is a trace");
log.debug("this is a debug");
log.info("this is a info");
log.warn("this is a warn");
log.error("this is a error");
System.out.println("==================================");
return "hello trace";
}
}
打印结果:
注解:
1> 在获取对象时,如果像上图一样使用 类(.class)获取日志,那么日志打印结果就是包名+类名的方式;但如果是使用类名,那么日志打印结果为类名,包名不会打印。
2> Logger对象定义的日志,是使用slf4j下的Logger对象。
注意:使用LomBok的目的是为了在
log.
的时候,可以识别到@Slfj注解下的方法。
Lombok原理:Lombok是在Java代码编译成字节码前执行的。在点运行后,编译Java代码前,Lombok会检查到代码中使用了 @Slf4j,那它就会自动给Java源文件中加上log日志对象,然后再进行编译生成字节码文件。(可以在缓存文件中查看验证)
使用Lombok和@Slf4j打印日志信息步骤:
1> 引入Lombok, 2> 使用@Slf4j注解 3> 直接使用log作为日志对象使用
@RestController
@Slf4j // 给当前类添加一个 名称为 log 的日志对象,相当于TestController中Slf4j包内Logger对象
public class TestController2 {
@RequestMapping("/test/fuc")
public String func(){
// 注意:使用LomBok的目的是为了在 log. 的时候,可以识别到@Slfj注解下的方法。
log.info("this is a info");
return "succeed!";
}
}
日志级别
理解:日志级别有什么用处?
1> 日志级别可以帮我们筛选出重要的信息,比如设置日志级别为error,那么程序运行起来后只有error级别及以上的错误信息才会展示,方便观察。
2> 日志级别可以控制不同环境下,需要打印的不同日志信息。比如比如开发环境我们需要很详细的日志信息,方便调bug;而生产环境为了保证性能和安全性就会打印尽量少的日志。
怎么设置日志级别?
首先要知道,spring boot默认日志级别为info。我们可以在配置文件中设置日志的级别。下面是通过设置日志级别 控制不打印系统日志信息,只打印我们手写代码日志的设置:
第一步:如下图,就是利用上篇博客的分环境使用配置文件,在开发阶段使用dev(在application.yml里设置指定)。
第二步:在dev配置信息中设置logging->level->root
作为系统日志打印信息,即只有error和fatal的错误可以打印,所有如果启动系统时没有错误,那么就只会打印springboot启动的logo,没有系统日志信息被打印。
第三步:要打印的类的日志级别,需要在root同等级的目录下添加 包名+类名com->example->demo->controller->TestController
日志打印结果:
理解:由于系统日志级别设置为error,程序又运行正常,所以没有系统日志信息打印(只有SpringBoot的logo);而我们自定义的TestController类的日志级别设置为了trace,因此对于TestController类的日志信息来说,日志级别为trace及以上的日志信息均可打印。因为trace是最低日志级别,也就相当于关于TestController类的方法中要打印的日志可以全部打印。
注意:要想持久化存储日志,可以指定日志存储目录(1),也可直接指定日志文件的名称(2)
1> 指定日志存储目录:这种操作会指定到 E:\home 目录,如果没有会创建(我这里名字未被改成home,而是显示新建目录),并将日志文件在该目录中创建出来,并把日志信息写入日志文件
logging:
file:
# 第一种:
path: E:\\home
2> 指定日志文件的名称:这种操作是 创建日志文件,将它放在指定路径中,如果未指定,则按以下方式存储
logging:
file:
# 第二种:未设置log文件的地址,只设置了名称,会保存在当前项目中
name: springboot.log
# 第三种:保存在E盘home路径下springBoot的log文件中,如果无home目录,则启动项目时会自动先创建。
name: E:\\home\\springBoot.log
# 第四种:保存在E盘 home路径下,日志文件名字为home。
name: E:\\home