Spring Boot的日志是指在Spring Boot应用程序中记录事件和信息的机制。就是用来查 BUG 的,可以帮助我们快速定位和解决应用程序中的问题。
它的作用:
创建一个 SpringBoot项目后,我们点击运行,在控制台会弹出如下内容:
这些其实就是系统自带的日志。那么我们如何自定义日志呢?
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。
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个呢?后面一一来解答:
日志的输出格式:
为什么我明明写了5个方法,为什么只打印了3个呢?这就是与日志级别相关了。
SpringBoot日志的级别用于控制输出日志的详细程度。
每种不同的日志等级对应一组不同的日志信息,级别越高,输出的日志信息就越详细。各种日志级别的含义如下:
SpringBoot中日志级别从低到高依次为:trace < debug < info < warn < error < fatal,默认的级别是info。
日志的输出规则:当前的级别以及比当前级别高的日志才能输出(不会输出fatal),上面的 5 种不同的方法分别对应不同的日志级别,注意,没有fatal()方法,因为当出现fatal级别的时候程序就会被终止。
这也就是上面写了5个方法,只打印了3个的原因。
我们可以设置日志的级别,在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启动类中打印出来的。
持久化就是把日志放在硬盘上,存储为日志文件,这一步是非常重要的。
在配置文件中设置配置文件的路径:
# 设置日志文件的目录 logging.file.path=D:\logging\ 复制代码
不用自己去创建这个路径,它会自动创建,开始运行并访问:
它会默认在目录中创建一个文件,文件里面装了你自己写的日志内容。那么问题来了,我多次访问接口方法,它会覆盖掉这里面的内容吗?
答案是不会的,它会在后面追加。
可以进一步精确到文件名:
# 设置日志文件的文件名,注意这里是 name 属性 logging.file.name=D:\logging\mySpring.log 复制代码
现在还有一个问题,如果程序运行时间周期很长(比如生产环境),那么日志一定是非常多的,用一个文件来存储显然不现实,那么如何让它自动地分成多个文件呢?
可以设置日志文件存储大小的最大容量。
# 设置日志大小的最大大小 1KB(一般不会这么小,这里用于演示) logging.logback.rollingpolicy.max-file-size=1KB 复制代码
这个配置项用于指定一个日志文件的最大大小,支持的单位包括 KB、MB、GB 等。,当日志文件达到指定大小后,将自动创建一个新的日志文件来继续记录日志信息,我以上面的代码为例,我经过多次请求后:
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!"; } } 复制代码