IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Spring Boot】Spring Boot 日志文件详解 -> 正文阅读

[Java知识库]【Spring Boot】Spring Boot 日志文件详解

1. 日志介绍

1.1 日志是什么?

日志 就是介绍一个过程的详细记录,项目中的日志 就是项目开发过程的详细记录,代码里的日志 就是程序员记录某个开发过程的详细情况。

代码里的日志是项目中非常重要的组成成分,它的详细程度能够决定系统是否容易维护。

1.2 日志的作用

  • 发现问题和定位问题。
  • 记录用户的登录日志,方便大数据分析用户信息。
  • 记录系统的操作日志,方便恢复数据和定位操作人。
  • 记录程序执行的时间,方便为以后优化程序提供数据支持。

1.3 日志格式说明

Spring Boot 项目在启动时默认就有日志输出,如下图所示:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nZ53z81k-1652470405591)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220513032937517.png)]

其中日志的格式包含了六个部分,分别是:

  • 日志打印的时间
  • 日志级别
  • 线程ID
  • 线程名称
  • 执行的类型
  • 日志信息

2. 常见日志框架说明

Java 中日志的演化历史:

在 Java 中,最先出现的日志是 Apache 开源社区中的 log4j。后来 Java 开发主体 Sun 公司在 jdk1.4 中增加了 JUL(java.util.logging 包下)日志的实现,由于不同的日志工具之间没有关联,导致替换和统一日志工具变得非常棘手,使得 Java 开发局面比较混乱。

为了解决这个问题,Apache 开源社区提供了一个日志框架 commons-logging 作为日志的抽象,commons-logging 对各种日志接口进行抽象,抽象出了一个接口层,对每个日志实现都进行适配,出色的兼容了主流的日志实现,包括 log4j 和 JUL 等。

后来 log4j 的作者实现了一个更加优雅的日志框架 SLF4J,并为 SLF4J 实现了一个 logback 的具体实现。最后又将 log4j 改造成了新的 log4j2,并让其能够支持 commons-logging 和 SLF4J。

Java 日志体系图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m1AyvRED-1652470405592)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220513040543066.png)]

通过上述 Java 日志演化的历史和体系图,我们可以了解到:

  • commons-logging 和 SLF4J 是日志的接口,而没有提供实现。
  • log4j 1/2、JUL、logback 是日志的具体实现。

为什么需要日志接口?

接口用于定制规范,可以有多个实现,使用时是面向接口的(导入的包都是 SLF4J 的包或者是 commons-logging 的包,而不是具体某个日志框架中的包),即直接和接口交互,不直接使用实现,所以当需要更换实现的时候,直接更换就可以了,而不用更改代码中的日志相关代码。

3. 日志级别

3.1 日志级别的作用

日志的级别能够筛选符合目标的日志信息。对日志进行分级,能够过滤出自己想看的信息,比如设置日志级别为 error,那么就可以只看到程序的报错日志,而忽略普通的调试日志和业务日志等,节省了开发者的信息筛选时间。

3.2 日志级别的分类

日志级别(从低到高)说明
trace很低的日志级别,一般不会使用。
debug指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
info消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息。
warn表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
error指出虽然发生错误事件,但仍然不影响系统的继续运行。
fatal指出每个严重的错误事件将会导致应用程序的退出。
  • 默认日志级别为 info。
  • 程序会打印高于或等于当前日志级别的日志。

3.3 日志级别的设置

在项目的配置文件中设置 logging.level 就可以设置日志级别。

application.properties 中设置日志级别:

# 设置所有目的的日志级别为 error
logging.level.root=error

# 设置 com.example.demo.controller 目录下的日志级别为 debug
logging.level.com.demo.controller=debug

application.yml 中设置日志级别:

logging:
  server:
    root: error # 设置所有目的的日志级别为 error
    com:
      example:
        demo:
          controller: debug # 设置 com.example.demo.controller 目录下的日志级别为 debug

4. 自定义日志打印

4.1 在程序中得到日志对象

在程序中,日志对象为 Logger,获取日志对象需要使用日志工厂 LoggerFactorygetLogger 方法,代码如下所示:

// 1. 得到日志对象
private Logger logger = LoggerFactory.getLogger(LoginController.class);

这里推荐使用 SLF4J + logback 或者 SLF4J + log4j2,而 Spring Boot 中内置了日志框架 SLF4J,所以在使用的时可以直接使用。上述使用的是 SLF4J 日志框架,所以 Logger 对象是属于 org.slf4j 包下的,导包的时候不要导错!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-54HD9nBI-1652470405592)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220513044128564.png)]

4.2 使用日志对象打印日志

在要执行的类中,使用日志对象提供的 API 进行日志打印。代码如下所示:

@Controller
@ResponseBody
public class LoginController {

    // 1. 得到日志对象
    private Logger logger = LoggerFactory.getLogger(LoginController.class);

    @RequestMapping("/login")
    public String login(String username, String password) {
        // 2. 使用日志打印
        logger.trace("日志级别 trace");
        logger.debug("日志级别 debug");
        logger.info("日志级别 info");
        logger.warn("日志级别 warn");
        logger.error("日志级别 error");

        String result = "未知错误!";
        if (StringUtils.hasLength(username) && StringUtils.hasLength(password)
                && username.equals("admin") && password.equals("1234")) {
            result = "登录成功!";
        } else {
            result = "登陆失败!用户名或密码错误!";
        }
        return result;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Z6mzvFL-1652470405593)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220513045534146.png)]

上述代码中,由于没有主动设置日志级别,默认日志级别为 info。因为程序只会打印高于或等于当前日志级别的日志,因此并不会打印 trace 的日志信息。而

5. 日志持久化

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

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

配置日志文件的保存路径:

# 设置日志文件的保存路径
logging:
  file:
    path: C:\Users\bbbbbge\Desktop

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T0IqIk9H-1652470405593)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220513165145130.png)]

配置日志文件的文件名:

# 设置日志文件的文件名
logging:
  file:
    # path: C:\Users\bbbbbge\Desktop
    name: C:\Users\bbb bbge\Desktop\spring-boot.log

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMR44rSi-1652470405593)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220513165354577.png)]

6. 更简单的日志打印方式 lombok

6.1 lombok 介绍

lombok 是一个 Java 库,能自动插入编辑器并构建工具,简化 Java 开发。通过添加注解的方式,不需要为类编写getter、setter、equals、toString 等方法,同时可以自动创建日志变量。

使用 lombok 前需要在项目中引入其依赖:

<dependency>
 <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.20</version>
    <optional>true</optional>
</dependency>

6.2 lombok 注解说明

基本注解作用
@Getter自动添加 getter 方法
@Setter自动添加 setter 方法
@ToString自动添加 toString 方法
@EqualsAndHashCode自动添加 equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor自动添加全属性构造方法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor自动添加必须属性的构造方法,final + @NonNull 的属性为必须属性
组合注解
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor
日志注解
@Slf4j自动添加一个名为 log 的日志对象,使用 SLF4J

6.3 使用 @Slf4j 注解打印日志

通过 lombok 中的 @Slf4j 注解,可以自动添加一个名为 log 的日志对象对象,使得我们不用每次再通过 LoggerFactory.getLogger(xxx.class) 代码的方法去创建一个日志对象。

示例代码:

@Controller
@ResponseBody
@Slf4j
public class LoginController {

    @RequestMapping("/login")
    public String login(String username, String password) {
        // 2. 使用日志打印
        log.trace("日志级别 trace");
        log.debug("日志级别 debug");
        log.info("日志级别 info");
        log.warn("日志级别 warn");
        log.error("日志级别 error");

        String result = "未知错误!";
        if (StringUtils.hasLength(username) && StringUtils.hasLength(password)
                && username.equals("admin") && password.equals("1234")) {
            result = "登录成功!";
        } else {
            result = "登陆失败!用户名或密码错误!";
        }
        return result;
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5uDQIxci-1652470405594)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220514022828313.png)]

6.4 lombok 工作原理

通过 lombok,我们只需要添加相应的注解,就能够省略对应的代码。那么 lombok 为何能做到这么神奇的事呢?

我们编写的代码是 Java 文件,而编写完成后需要通过编码生成字节码文件,JVM 通过加载和运行字节码文件才能得到程序的结果。

我们可以观察和比较一下上述代码的源文件和字节码文件中代码的差别:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ek842DlZ-1652470405594)(../../../Pictures/%E6%8E%A5%E5%8D%95/image-20220514024912986.png)]

我们发现,源代码中我们使用的 @Slf4j 注解在字节码文件中消失了,反而字节码文件中多出了使用LoggerFactory.getLogger(xxx.class) 获取日志对象的一行代码,并且创建的日志对象变量叫 log。因此我们可以猜测出 lombok 中的注解在 Java 代码编译的时候能够转换成对应的代码,使得最终的字节码文件能够正常运行。

lombok 实际上是通过 jdk 实现的 JSR 269: Pluggable Annotation Processing API (编译期的注解处理器),在编译期时把 lombok 的注解转换成 Java 代码,相当于在编译期对代码进行了修改。

我们知道 Java 源文件是通过 javac 编译器来编译成字节码文件的,而 javac 编译器的编译过程大致可以分为1个准备和3个处理过程:

  1. 初始化插入式注解处理器
  2. 解析与填充符号表
  3. 插入式注解处理器的注解处理
  4. 分析与字节码生成

而 lombok 就是实现了插入式注解处理器,通过插入式注解处理器,就可以读取、修改、添加抽象语法树中的任意元素。因此,在 javac 编译的过程中,它产生的作用流程具体如下:

  1. javac 对源代码进行分析,生成了一棵抽象语法树(AST)。
  2. 运行过程中调用实现了插入式注解处理器的 lombok 程序。
  3. lombok 对 AST 进行处理,找到相关注解所在的类对应的语法树,然后修改 AST,增加相应的代码定义的语法树的节点。
  4. javac 使用修改后的抽象语法树生成字节码文件。

6.5 lombok 的优缺点

优点:

  • 能通过注解的形式自动生成构造器、getter、setter、equals、hashcode、toString 等方法,提高了一定的开发效率。
  • 让代码变得简洁,不用过多的去关注相应的方法。
  • 属性做修改时,也简化了维护为这些属性所生成的 getter、setter 方法等。

缺点:

  • 不支持多种参数构造器的重载。
  • 虽然省去了手动创建 getter、setter 等方法编写的麻烦,但大大降低了源代码的可读性和完整性,降低了阅读源代码的舒适度。
  • 由于是编译器生成的代码,所以不能够调试。
    码文件。
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:28:59  更:2022-05-18 17:30:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:37:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码