目录
日志文件作用
- 记录 错误日志 和 警告日志(发现和定位问题)
- 记录 用户登录日志,分析用户是否正常登录
- 记录 系统操作日志,方便 数据恢复 和 定位操作人
- 记录程序执行时间,方便以后为优化程序提供数序支持
常见的日志框架说明
门面模式
- 设计模式的一种
- 门面模式就是一种通过引入一个简化接口来隐藏复杂细系统的设计模式,它提供了一种简单的方式让客户端与系统进行交互,同时降低了客户端和系统之间的耦合度
简单理解
- 日志系统有多个,即多个不同的框架,框架的本质是多个工具类的集合
- 不同的框架有着不同的类名,不同的类名也有着不同的方法名
- 所以 Log4j、JUL、Logback、Slf4j-Simple 这些日志系统的写法完全一点边都不沾
导致问题
- 如果此时直接在应用程序中以 Log4j 日志系统为基本进行日志操作
- 有一天 Log4j 日志系统 出现了严重 bug,需要将该应用程序的 日志系统 改为 Logback 时
- 因为这两个日志系统的写法完全一点边不沾,所以此时应用程序中需要修改代码就会很多很多
解决方法
- 引入日志门面
- 我们按照 日志门面 所提供的写法来写日志操作代码
- 然后 日志门面 会根据程序员的配置 和 程序员引入的驱动 来操作最底层的日志系统
- 通过该方式便可轻松切换日志系统
- 从而很大程度上降低了应用程序和日志系统的耦合度
- Spring Boot 内置的日志门面是 Slf4j 、日志系统是 Logback
日志的使用
得到日志对象
- 在 TestController 类中使用日志工厂 LoggerFactory 获取日志对象
- 日志在程序运行期间只加载一次,并且不可变,所以使用 static 和 final 修饰
// 1.得到日志对象 private static final Logger log = LoggerFactory.getLogger(TestController.class);
注意:
- Logger 有很多一定要选择导入下图红框的包
使用日志对象提供的方法打印日志
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 // 加在类上,表示当前类中的所有方法返回的都是非静态页面的数据 @RequestMapping("/test") // = @WebServlet("/url") public class TestController { // 1.得到日志对象 private static final Logger log = LoggerFactory.getLogger(TestController.class); @RequestMapping("/say-hi") // = @WebServlet("/url") public String sayHi() { // 2.打印日志 log.trace("i am trace"); log.debug("i am debug"); log.info("i am info"); log.warn("i am warn"); log.error("i am error"); return "hello world "; } }
运行结果:
- 先在浏览器中访问下图路径
- 再观察控制台输出的日志信息
- 我们自定义打印的日志信息有五条
- 在上图运行结果中,控制台却仅打印了后三条日志信息
- 因为此时 Spring Boot 默认打印的日志级别为 info 级别
- 即 大于或等于 info 级别的日志信息才会打印出来
日志的级别
六种级别
trace
- 微量,少许的意思,级别最低
debug
需要调试的时候的关键信息打印
info
- 普通的打印信息,默认日志级别
warn
- 警告,不影响使用,但需要注意的问题
error
- 错误信息,级别较高的错误日志信息
fatal
- 致命的,因为代码异常导致程序退出执行的事件
- fatal 级别无法进行相应操作
日志级别的设置
- 日志输出的默认级别是 info
- 我们可以在配置文件中手动配置默认日志输出级别
- 在配置文件 application.yml 中,加入下段配置代码即可
logging: level: root: warn
- 上述配置代码的作用域为根目录(root)下的所有包
- 表示设置根日志记录器的级别为 warn
- 这意味着,应用程序中所有的日志记录器都将继承这个级别
- 除非它们已经被明确地设置了其他级别
运行结果:
- 如果我们想设置指定某一包下的日志输出级别
- 可按下图方式添加配置代码
- 红框路径以 java 目录为起始目录
运行结果:
- 明确指定某一包下的日志输出级别的优先级高于 使用 root 指定根目录下所有包的日志输出级别
日志的持久化
- 上述日志的仅在控制台输出
- 在生产环境中我们需要将日志保存下来
- 以便出现问题后可以追溯问题
指定日志的存储目录
- 启动 Spring Boot 后
- 在 E盘的 test 目录下的 testDemo 目录下会出现日志文件
- 如果启动前无该路径,启动后便会自动创建出该路径
logging: file: path: E://test//testDemo
指定日志文件的文件名
- 启动 Spring Boot 后
- 会在指定目录下生产一个名为 spring-log.log 的日志文件
logging: file: name: E://test//testDemo//spring-log.log
注意一:
- 保存日志的路径不要放在系统盘(C 盘)
- 路径中不要出现中文和空格
注意二:
- 在 Spring Boot 中进行日志记录时
- 如果没有指定日志文件的名称 或 两次保存的日志指定了相同的文件名
- 那么第二次运行 Spring Boot 时,其保存的日志信息会被追加到第一次保存的日志文件后面,而不是覆盖第一次保存的日志信息
- 因为 Spring Boot 的日志系统默认是以 追加模式 来写入日志的
- 也就是说每次写入日志时,都会在原有日志的基础上添加新的日志信息,而不会删除或覆盖原有的日志
注意三:
- 日志文件的大小通常会有一个上限
- 这是为了防止日志文件过大导致加载速度变慢
- 当日志文件达到一定大小后,Spring Boot 会自动创建一个新的日志文件
- 以防止单个日志文件过大
- Spring Boot 中日志文件默认大小是 10MB
- 但我们可以通过下段配置代码,实现手动配置日志文件的大小上限
logging: file: path: E://test//testDemo//spring-log.log max-size: 8MB
- 该段配置代码将日志文件的大小上限设置为 8MB
阅读下面内容之前 建议点击下方链接了解和添加 Lombok 依赖
使用 Lombok 输出日志
实例理解
- 我们在 EasyController 类上加 @Slfj 注解
- 即可直接在该类中使用 log 对象
import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @ResponseBody @Slf4j public class EasyController { @RequestMapping("/test/easy") public void sayHi() { log.error("i am error"); } }
实现原理
- Java 程序在 IDEA 中执行完后会生产一个 target 文件
- 该文件为源代码完成去掉注释等一系列工作后的文件
- 且该文件就是该项目执行的最终代码
- 我们发现 Lombok 的实现原理就是在编译阶段加上了我们原本需要的代码
普通打印和日志的区别
最关键的两个区别
- 普通打印 没有级别的控制,无法进行信息的筛选
- 普通打印 不支持持久化,无法保存下来