> 文章列表 > 【 SpringBoot ⽇志⽂件 】

【 SpringBoot ⽇志⽂件 】

【 SpringBoot ⽇志⽂件 】

文章目录

  • 一、⽇志的作用
  • 二、认识⽇志
  • 三、⾃定义⽇志打印
    • 3.1 在程序中得到⽇志对象
    • 3.2 使⽤⽇志对象打印⽇志
    • 3.3 ⽇志格式说明
  • 四、⽇志级别
    • 4.1 ⽇志级别的作用
    • 4.2 ⽇志级别的分类与使⽤
      • 4.2.1 ⽇志级别的分类
      • 4.2.2 ⽇志使⽤
        • 4.2.2.1 配置全局日志级别
        • 4.2.2.2 配置局部文件夹的日志级别
        • 4.2.2.3 更简单的⽇志输出—lombok
          • 4.2.2.3.1 如何在程序开发中途去添加一个框架依赖?
  • 五、⽇志持久化
  • 六、总结

一、⽇志的作用

⽇志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是排除和定位问题

除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:

  1. 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户
  2. 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈
  3. 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持

以上这些都是⽇志提供的⾮常实⽤的功能

⽇志真实使⽤案例:

关键节点上的关键数据⽇志记录举例:例如教务系统,在注册时不⽌要在教务系统添加⼀条⽤户记录,同时也会给论坛添加⼀条⼀模⼀样的⽤户记录,这样做的⽬的是为了实现⼀次注册,多处使⽤的⽬的。不需要⽤户在两边系统注册了,等于在程序中以极低的成本实现的⽤户数据的同步,但这样设计有⼀个致命的问题,⽤户在教务系统注册信息的时候,如果论坛挂了,那么⽤户的注册⾏为就会失败?因为⽤户在注册的时候需要同步注册到论坛系统,但论坛现在挂了,这个时候怎么办呢?最简单的解决⽅案,教务系统在注册的时候,不管论坛是否注册成功,都给⽤户返回成功,那这个时候如果论坛注册失败了怎么办?⾮常简单,如果注册失败了,记录⼀下⽇志,等论坛恢复正常之后,把⽇志给论坛的管理⼈员,让他⼿动将注册失败的⽤户同步到论坛系统,这样就最低成本的解决了问题。这就是⽇志的重要作⽤

二、认识⽇志

Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:

【 SpringBoot ⽇志⽂件 】

通过上述⽇志信息我们能发现以下 3 个问题:

  1. Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。
  2. 默认情况,输出的⽇志并⾮开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
  3. ⽇志默认打印在控制台上,⽽控制台的⽇志是不能被保存的,那怎么把⽇志永久保存下来呢?

下⾯我们⼀起来找寻这些问题的答案

三、⾃定义⽇志打印

开发者⾃定义打印⽇志的实现步骤:

  1. 在程序中得到⽇志对象
  2. 使⽤⽇志对象的相关语法输出要打印的内容

3.1 在程序中得到⽇志对象

在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所示:

// 1.得到⽇志对象
private static Logger logger = LoggerFactory.getLogger(UserController.class);

⽇志⼯⼚需要将每个类的类型传递进去,这样我们才知道⽇志的归属类,才能更⽅便、更直观的定位到问题类

注意: Logger 对象是属于 org.slf4j 包下的,不要导⼊错包
【 SpringBoot ⽇志⽂件 】

因为 Spring Boot 中内置了⽇志框架 Slf4j,所以咱们可以直接在程序中调⽤ slf4j 来输出⽇志

常⻅的⽇志框架说明(了解):

【 SpringBoot ⽇志⽂件 】

门面 是一种设计模式,大家可以自行去了解!!


3.2 使⽤⽇志对象打印⽇志

⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所示:

// 2.使⽤⽇志打印⽇志
logger.info("--------------要输出⽇志的内容----------------");

打印⽇志效果展示:

【 SpringBoot ⽇志⽂件 】

3.3 ⽇志格式说明

【 SpringBoot ⽇志⽂件 】

四、⽇志级别

4.1 ⽇志级别的作用

⽇志的级别就是为了筛选符合⽬标的⽇志信息的。试想⼀下这样的场景,假设你⼀家 2 万⼈公司的⽼板,那么每⼈员⼯的⽇常⼯作和琐碎的信息都要反馈给你吗?⼀定不会,因为你根本没有那么多经历。于是就有了组织架构,⽽组织架构就会分级,有很多的级别设置,如下图所示:

【 SpringBoot ⽇志⽂件 】

有了组织架构之后,就可以逐级别汇报消息了,例如:组员汇报给组⻓;组⻓汇报给研发⼀组;研发⼀组汇报给 Java 研发,等等依次进⾏汇报

⽽⽇志分级⼤概的道理也是⼀样的,有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者的信息筛选时间

4.2 ⽇志级别的分类与使⽤

4.2.1 ⽇志级别的分类

⽇志的级别分为:

  1. trace:微量,少许的意思,级别最低;
  2. info:普通的打印信息;
  3. debug:需要调试时候的关键信息打印;
  4. warn:警告,不影响使⽤,但需要注意的问题;
  5. error:错误信息,级别较⾼的错误⽇志信息;
  6. fatal:致命的,因为代码异常导致程序退出执⾏的事件

⽇志级别的顺序:

【 SpringBoot ⽇志⽂件 】

越往上接收到的消息就越少

4.2.2 ⽇志使⽤

4.2.2.1 配置全局日志级别

配置跟路径的⽇志级别:⽇志级别配置只需要在配置⽂件中设置“logging.level”配置项即可,如下

# 设置全局的日志级别,默认是 info
logging.level.root=info

创建一个 UserController 类,代码如下

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// 返回一个非静态页面的数据
public class UserController {//1.先得到日志对象 来自 self4j(springboot内置的 日志框架)private final static Logger logger =LoggerFactory.getLogger(UserController.class);//设置当前类的类型,方便打印该类的日志@RequestMapping("/sayhi")public void sayhi(){//2.使用日志对象提供的打印方法进行日志打印logger.trace("我是 trace");logger.debug("我是 debug");logger.info("我是 info");//比 info小的级别日志 打印不出来logger.warn("我是warn");logger.error("我是 error");}

运行结果如下:

【 SpringBoot ⽇志⽂件 】

注意: 日志级别比配置文件中设置的级别低就不能打印,并且日志级别默认事 info


4.2.2.2 配置局部文件夹的日志级别

【 SpringBoot ⽇志⽂件 】

再次运行 UserController 类,效果如下:

【 SpringBoot ⽇志⽂件 】

可以观察到,这次日志等级低于 info 的也被打印出来了,但是我们的全局日志级别还是 info,这是为什么呢?

注意: 当同时存在局部 和 全局的日志级别设置时,局部日志级别优先级 高于 全局


4.2.2.3 更简单的⽇志输出—lombok

每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这⾥讲⼀种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出

  1. 添加 lombok 框架⽀持
    可以在创建 springb 项目时,勾选 lombok 框架,也可以手动注入该依赖

【 SpringBoot ⽇志⽂件 】

4.2.2.3.1 如何在程序开发中途去添加一个框架依赖?
  1. 添加插件 Edit Starters
  2. 在 pom.xml 中右击鼠标点击 Generate
    【 SpringBoot ⽇志⽂件 】

  1. 使⽤ @slf4j 注解输出⽇志

以上我们是通过 Logger logger = LoggerFactory.getLogger(UserController.class) 来获取日志对象的!为了方便 我们可以使用 注解@Slf4j 代替了 LoggerFactory.getLogger 操作,如下:

@Controller
@ResponseBody// 返回一个非静态页面的数据
@Slf4j//使用注解代替了 LoggerFactory.getLogger 操作
public class UserController {@RequestMapping("/sayhi1")public void sayhi1(){log.error(" i am error");// slf4j 注解提供了 log对象}
}

注意: 使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名

lombok 原理解释:

lombok 能够打印⽇志的密码就在 target ⽬录⾥⾯,target 为项⽬最终执⾏的代码,查看 target ⽬录中的 classes 文件查看源码如下:

【 SpringBoot ⽇志⽂件 】

由此可见,使用 @Slf4j 注解是在生产字节码文件之前通过 LoggerFactory.getLogger 操作得到了日志对象 log,如下:

【 SpringBoot ⽇志⽂件 】


lombok 更多注解说明:

基本注解:

【 SpringBoot ⽇志⽂件 】

组合注解:

【 SpringBoot ⽇志⽂件 】

日志注解:

【 SpringBoot ⽇志⽂件 】

五、⽇志持久化

以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化

想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后,Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下

  1. 设置日志文件保存的路径
logging.file.path=F:/JavaTestDemo/loggingTestDemo

运行 UserController 类效果如下:

【 SpringBoot ⽇志⽂件 】

打开该文件夹观察:

【 SpringBoot ⽇志⽂件 】

由此可见我们打印的日志成功保存在我们设置的文件目录下!!

  1. 设置日志文件的文件名
logging.file.name=F:/JavaTestDemo/loggingTestDemo/spring-boot-logging

再次运行,效果如下:

【 SpringBoot ⽇志⽂件 】

使用 VC code 即可打开看到日志信息 !!


六、总结

⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,Spring Boot 内容了⽇志框架,默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解和 log 对象快速的打印⾃定义⽇志,⽇志包含 6 个级别。⽇志级别依次提升,⽽⽇志界别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志永久地保存下来