SpringBoot日志文件
日志文件作用
日志是程序的重要组成部分,我们通常情况下程序出现bug,都是通过日志信息更改bug!
日志最基本的功能就是发现和定位问题(找bug),我们还可以通过日志实现一下功能:
- 记录用户登入信息日志,可以分析用户是否正常登入还是恶意破解用户!
- 记录系统操作日志,方便数据恢复和定位问题!
- 记录程序运行时间,方便后续程序优化进行数据支持!
我们可以将日志类比于游戏存档,当你玩游戏,突然手机关机了,当你再次打开游戏,游戏的进度还是你但是关机的时候的进度,日志也是如此,就是记录下了程序的运行的操作过程,便于后续定位到程序发生问题的位置然后方便恢复数据!
日志使用
创建一个SpringBoot
项目
删除无效的文件
启动项目!
控制台输出的信息就是日志信息!
我们通过这里的日志信息可以看到程序是否运行成功!
日志格式说明:
通过上面日志信息的打印,我们知道:
- SpringBoot项目内置了日志框架(否则输出不了日志)
- 系统默认日志打印到控制体,我们开发者如何自定义打印日志?
- 日志默认只能在控制台显示,如何永久存储日志信息?
自定义打印日志
- 获取到日志框架中的日志对象
- 通过日志对象中的方法打印日志信息
我们日志对象Logger
类来自slf4j
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 //将该Bean注册到spring
@ResponseBody //SpringMVC默认返回静态页面,修改默认
public class Userlogger {
//通过slf4j中的LoggerFactory日志工程或者到日志对象!
//这里需要传入当前类的反射,指定日志来源
private Logger log = LoggerFactory.getLogger(Userlogger.class);
//设置路由
@RequestMapping("/sayHi")
public void sayHi(){
//通过log对象自定义打印日志!
log.trace("trace");
log.debug("debug");
log.info("info");
log.error("error");
}
}
在浏览器访问这个sayHi接口,控制台就打印了我们自定义的日志信息!
Slf4j
这里我们使用的Slf4j
采用的门面模式!
就相当于一个代理,一个门面,底层的日志实现是logback
等实现方式实现的!
就是说这种方式,就算底层的实现模式,更改了,也不会影响Slf4j!
日志级别
看了刚刚的自定义日志打印信息,可能你会疑惑,为啥我写了4个日志打印语句,结果只打印了2个日志?
日志级别:
- trace: 微量,少许,最低级别日志!
- debug: 调试时关键信息日志打印!(调试)
- info: 普通日志打印信息!(默认级别)
- error: 错误信息,较高级别的日志信息(可自定义的最高级别)
- fatal:致命的,因为代码异常导致程序退出!
上面的日志级别由低到高!
前面4种日志级别都可以自定义打印!
最后一种无法自定义,由系统完成!
日志默认是info级别!
日志级别作用
可能看到这,还是有点懵!
这日志级别有啥子用?
我们可以日志级别的设置,过滤掉一些我们不需要的日志信息,比如你只想找程序保存的日志,你就可以将日志级别设置成
error
这样一来,你就看不到比error级别更低的日志(trace,info,debug),通过这种这种方式,你可以快速定位问题!
设置日志级别
我们刚刚演示的项目,因为没有设置日志级别,直接就是默认
info
级别,所以没有打印trace/debug
日志信息!
我们可以通过配置文件设置当前项目日志级别
- 设置全局的日志级别
# 设置全局日志级别
logging.level.root = error
这里的全局root
指的是项目的源文件java
目录
所以设置指定包下的日志级别也是从这个java
目录开始!
- 设置某一包下的日志级别(局部)
# 设置某一包下的日志级别(局部)
logging.level.com.example.demo.controller = trace
再次启动项目
因为我们设置的默认日志级别为error,所以项目启动成功的日志信息(info)未打印到控制台
我们通过浏览器访问一下sayHi!
可以看到我们在controller
包下自定义日志打印信息就打印到了控制台!
可以看到日志配置级别优先级局部大于全局
永久化存储日志
我们发现日志现在虽然可以自定义了,但是存在一个问题,只能在控制台看,如果项目突然就关闭了,那我们日志岂不是没了!
我们如何进行日志持久化存储呢?
配置日志保存的路径位置/文件
我们可以通过配置文件,配置日志需要保存的路径位置或者日志保存在那个文件下
- 配置日志保存到某一路径下
配置保存到上面路径下!
但是报错了,因为\
将字符转义了,所以我们可以使用\\
或者/
代替!
建议使用/
因为我们的程序要部署在Linux
下
# 配置日志保存路径
#错误!
#logging.flile.path = D:\java\src
#正确配置
logging.file.path= D:/java/src
启动项目
自动生成了一个spring.log
的日志文件,里面的日志内容和控制台上的一样!
这样我们就可以持久化存储日志了!
- 配置日志保存在某一日志文件下
# 配置日志保存在log.log文件下
logging.file.name=D:/java/src/log.log
如果我们不指定保存的路径,系统会保存在这个项目中的target
目标文件夹下
通常情况下,日志文件默认大小为
10M
,如果项目中的日志文件大小超过了这个默认值,会进行切分,再生成新的日志日志文件,这里的默认日志大小也可以直接修改!
更简单的日志输出lombok
我们刚刚自定义输出日志,如果要获取某一个类的日志时,要先获取到这个类的日志对象,显然有些许的麻烦,当有很多类都要获取日志时,这个步骤就重复了,如何省略这个繁琐的步骤呢?
我们知道Spring项目嘛,无法就是一个注解,就搞好了嘛!
这里也是如此,我们通过@slf4j
就可以省略下面获取日志对象的代码
package com.example.demo.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@ResponseBody
@Controller
@Slf4j //获取到这个类的日志对象 log
public class Slf4jlogger {
@RequestMapping("/hello")
public String Hello(){
//通过上@Slf4j 注解生成的 log 对象自定义打印日志!
System.out.println("@Slf4j");
log.trace("trace");
log.debug("debug");
log.info("info");
log.error("error");
return "@Slf4j";
}
}
这里的@Slf4j
日志注解是来着lombok
框架的,我们引入lombok框架即可使用该备注! 使用该备注默认在当前类中生成了一个log
日志对象!
lombok框架注解
注解实现原理
我们通过使用了
lombok
下注解的源代码和字节码文件对比就可以明白其实现原理!
源文件
目标文件
可以看到在源代码中的@Slf4j
注解,在字节码class文件中,消失不见了,然后多了创建日志对象的语句
private static final Logger log =
LoggerFactory.getLogger(Slf4jlogger.class);
就是说
lombok
里的注解,在编译阶段就会自动生成对应的语句代码,然后编译成字节码!
- 点赞
- 收藏
- 关注作者
评论(0)