Spring Boot 日志文件
日志的作用
日志在项目当中,最重要的就是发现和定位问题,然后其它功能如下:
- 记录用户登录日志,方便分析用户是否是正常登录,还是恶意破解登录。如果一个用户,一天登陆了几万次,那么就是在破解账户了。
- 记录系统的操作日志,方便数据恢复和定位操作人。比如说教务系统调课,一不小心调错了,就知道是谁调的。
- 记录程序的执行时间。记录项目的执行时间,然后针对进行优化。如果长时间没访问到某个资源的话,就可以去查看代码是否有问题。
日志的使用
在我们启动项目的时候,就已经输出日志了:
不过这些日志事不能保存下来的,是只能显示在控制台的。说明 Spring Boot 内置了日志框架。默认情况下是输出系统日志。
自定义日志打印
要实现自定义日志打印,有两步:
- 在一个类中先获取到日志打印对象(日志框架提供的日志对象,而日志加已经默认集成到 Spring Boot 当中了)。
- 使用日志对象提供的方法实现日志的打印。
通过类来得到日志对象
通过 Logger 类来得到日志对象,使用 slf4j 提供的日志对象:
private final static Logger log = LoggerFactory.getLogger(UserController.class);
把类名传进去,是为了更好的查看日志输出的时候,是从哪个类里面输出的。然后就可以在方法里面,使用日志对象提供的打印方法来进行日志打印了。
使用日志对象打印日志
⽇志对象的打印⽅法有很多种(info,error,warn,trace,debug):
@Controller
@ResponseBody
public class UserController {
//1、先得到日志对象,一定要设置当前类的类型
private final static Logger log = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/sayhi")
public void sayHi() {
//2、使用日志对象提供的打印方法进行日志打印
log.trace("track 日志级别最小的一种,少许日志");
log.debug("debug 调试阶段打印日志,调试日志");
log.info("info 普通的打印信息,默认的日志级别");
log.warn("warn 警告日志");
log.error("error 错误日志");
}
}
运行结果如下:
常用的日志框架
Spring Boot 当中,我们主要用的是 SLF4J 和 logback :
因为 SLF4J和 logback 在日志领域是顶尖的。
- 门面模式就是在类操作的时候,操作的是代理对象,就像 JDBC 对数据库的操作一样,不论什么数据库,都能进行操作。SLF4J 也是驱动某一个日志来进行打印。
- 然后通过 SLF4J 之后,再通过 logback 来打印日志。
如果 logback 出问题之后,是可以随便调用其他方法去输出日志的。对于普通的测试日志和业务日志就可以忽略了,从而节省开发者信息筛选时间。
日志级别
日志级别的作用
- 可以筛选出重要的信息,比如设置日志级别为 error,那么就可以只看程序的报错日志了。
- 可以控制不同环境下,一个程序是否需要打印日志。如开发环境,我们需要详细的信息,而生产环境为了保证性能和安全性就会输入尽量少的日志,而通过日志的级别就可以实现此需求。
⽇志级别的分类与使⽤
日志级别分为
- trace:微量,少许的意思,级别最低
- debug:需要调试时候的关键信息打印(调试日志)
- info:普通的打印信息(普通信息日志)【系统默认的日志级别】
- warn:警告,不影响使⽤,但需要注意的问题(警告日志)
- error:错误信息,级别较⾼的错误⽇志信息(错误日志)
- fatal:致命的,因为代码异常导致程序退出执⾏的事件。
日志级别的顺序
设置日志级别
通过 配置文件 当中来设置。通过 logging.level 来设置级别:
我们这里设置的是 info 级别,root 就是全局的日志级别:
可以明显的看出,日志的数量更多了。比 info 日志级别低的日志就看不到了。
设置局部文件的日志级别:
logging.level.java.com.example.springboot2.controller=trace
就是通过路径去设置,但是在局部级别的话,是局部优先:
日志持久化
上面的日志都是输出在控制台上面的,然而生存环境需要把日志保存下来,以便出现问题之后追溯问题。也就是将日志持久化:
-
在配置文件当中设置日志的保存路径,当设置类保存路径之后,那么日志就会自动的进行持久化。
logging.file.path=D:/
就是把日志文件直接保存在 D 盘当中:
也可以用反斜杠转义:
logging.file.path=D:\\
-
在配置文件中设置日志保存的名称,日志就会自动进行持久化:
logging.file.name=D:/spring-boot.log
日志太大的时候,会自动进行分割:
通过 lombok 进行日志输出
要输出日志的话,出了使用 日志对象,还可以使用 lombok 提供的 @Slf4j 注解,注解自动生成的对象是 log:
@Controller
@ResponseBody
@Slf4j
public class UserService {
@RequestMapping("/sayhi2")
public void sayHi2() {
log.trace("Lombok trace");
log.debug("Lombok debug");
log.info("Lombok info");
log.warn("Lombok warn");
log.error("Lombok error");
}
}
运行结果如下:
文件如下:
lombok 原理
我们的项目在编译的时候,是转化为 class 文件,然后让 JVM 来处理的。也就是在项目编译的时候,lombok 就又替我们转化为原来的日志对象了:
Java程序运行图和lombok作用图
Java 程序的运行原理图:
lombok 的作用图:
Lombok 并不会影响程序的运行速度,提高了开发效率。
Lombok 的其他注解
基本注解:
组合注解:
日志注解: