8. Spring Boot 日志文件

news2024/11/17 15:47:02

目录

1. 日志的作用

2. 如何使用日志

3. 自定义日志打印

3.1 获取日志对象

3.2 设置打印的内容

3.3 常见的日志框架

3.4 日志格式说明 

4. 日志级别

4.1 日志级别的作用

4.2 日志级别的分类

4.3 日志级别的使用

4.4 设置日志级别

4.5 分目录设置日志级别

5. 日志持久化

5.1 配置日志文件保存目录

5.2 分割日志文件

5.3 设置日志的名称 

6. 更简单的日志输出 - Lombok

6.1 基本注解 

6.2 组合注解

6.3 日志注解

7. 总结


1. 日志的作用

对于我们来说,日志最重要的用途就是排除和定位问题

除了以上的用途外,我们还可以通过日志实现以下功能:

  • 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
  • 记录系统的操作日志,方便数据恢复和定位操作人员。
  • 记录程序的执行时间,方便为以后优化程序提供数据支持。

2. 如何使用日志

Spring Boot 项目在启动时就默认输出日志:

以上就是 Spring Boot 输出的控制台信息。我们可以发现:

  1. Spring Boot 内置了日志框架
  2. 默认情况。输出的日志并是我们自己定义和打印的,那么我们如何自定义打印日志呢?
  3. 日志默认打印在控制台上,但是控制台的日志是不能被保存的,那么如何永久保存日志呢? 

3. 自定义日志打印

自定义打印日志的步骤:

  1. 获取日志对象
  2. 设置打印的内容

3.1 获取日志对象

private Logger logger = LoggerFactory.getLogger(LogController.class);

此时,我们就获得了日志对象 logger。 

3.2 设置打印的内容

接下来,在获取到日志对象后通过调用 info 方法,我们打印信息:

@Controller
public class LogController {
    private Logger logger = LoggerFactory.getLogger(LogController.class);
    
    @PostConstruct
    public void postConstruct(){
        logger.info("这是第一条日志信息...");
    }
    @RequestMapping("/log")
    public String log(){
        return "log...";
    }
}

 可以看到日志中打印了我们设置的内容:

当我们修改创建日志对象使用的名称时:

 private Logger logger = LoggerFactory.getLogger("aaa");

可以看到打印的日志同样改变了:

3.3 常见的日志框架

3.4 日志格式说明 

4. 日志级别

日志不宜过多或过少,过多会影响系统的性能;过少不利于排查问题。

4.1 日志级别的作用

  1. 日志级别可以筛选出重要的信息,比如设置日志级别为 error,那么就可以只看程序的报错日志,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间。
  2. 日志级别可以控制不同环境下,⼀个程序是否需要打印日志,如开发环境我们需要很详细的信息, 而生产环境为了保证性能和安全性就会输出尽量少的日志,因此通过日志的级别就可以实现此需求。

4.2 日志级别的分类

  • trace:微量,少许的意思,级别最低;
  • debug:需要调试时候的关键信息打印;
  • info:普通的打印信息(默认日志级别);
  • warn:警告,不影响使用,但需要注意的问题;
  • error:错误信息,级别较高的错误日志信息(需要解决);
  • fatal:致命的,因为代码异常导致程序退出执行的事件。

日志级别的顺序:

4.3 日志级别的使用

@Controller
public class LogController {
    private Logger logger = LoggerFactory.getLogger("aaa");

    @PostConstruct
    public void postConstruct(){
        logger.trace("trace...");
        logger.debug("debug...");
        logger.info("info...");
        logger.warn("warn...");
        logger.error("error...");
    }

    @RequestMapping("/log")
    public String log(){
        return "log...";
    }
}

打印如下图所示:

 可以看到只打印了部分信息:info、warn、error。

可以看到并没有提供 fatal 级别的,因为一旦出现这种级别就需要立刻去解决问题了。 

Spring Boot 项目默认的日志级别是 info,低于 info 级别的不打印;高于 info 级别的打印。

4.4 设置日志级别

在主配置文件 application.yml 中设置日志级别为 error:

logging:
  level:
    root: error

可以看到此时只打印了 error 级别的日志:

在主配置文件 application.yml 中设置日志级别为 warn,可以看到此时只打印了 warn 和 error 级别的日志:

在主配置文件 application.yml 中设置日志级别为 info,可以看到此时打印了info、warn 和 error 级别的日志:

可以看到,级别越高接收到的消息就越少

4.5 分目录设置日志级别

系统日志:打印 warn 级别 

业务日志:打印 debug 级别

logging:
  level:
    root: warn
    com:
      example:
        demo: debug

5. 日志持久化

在生产环境上需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。

5.1 配置日志文件保存目录

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

接下来,我们将日志保存在指定的目录下:

logging:
  file:
    path: D:\temp\

那么如何测试这些日志能够持久化的保存呢?

接下来,我们再次运行程序,可以看到刚才的文本文件显示如下:

也就是说新的日志会追加到之前的日志之后,并不会代替之前的日志,从而实现了永久化存储日志。

5.2 分割日志文件

这种追加形式,可能会带来一个新的问题:日志文件会越来越大。对此,Spring 已经规定了文件的大小当超过 10 MB 时会进行分割:

同样我们也可以自行设置分割的标准,日志文件超过 1KB 就进行分割:

spring:
  file:
    path: D:\temp\
  logback:
    rollingpolicy:
      max-file-size: 1KB

 还可以设置分割后的日志文件名称:

spring:
  file:
    path: D:\temp\
  logback:
    rollingpolicy:
      max-file-size: 1KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

5.3 设置日志的名称 

logging:
  file:
    name: springboot.log

运行后可以看到新的日志文件直接在当前工程下生成了(默认):

也可以设置路径:

logging:
  file:
    name: D:\temp\springboot.log

6. 更简单的日志输出 - Lombok

输出日志的步骤依然是:

  1. 获取日志对象
  2. 打印日志

 那么更简单的输出就是通过注解来完成,@Slf4j 注解 和 log 对象

@Slf4j
@Controller
public class LogController2 {

    @PostConstruct
    public void postConstruct(){
        log.trace("trace...");
        log.debug("debug...");
        log.info("info...");
        log.warn("warn...");
        log.error("error...");
    }
}

运行后可以看到两种方式最终实现的效果是相同的:

通过查看 class 文件,可以看到 class 文件中没有 @Slfj 注解,而是多出了一行 log 对象的定义。 

Java 程序的运行原理如下:

Lombok 的作用如下图所示:

6.1 基本注解 

接下来,我们来看 Lombok 的一些注解:

注解作用
@Getter自动添加 getter 方法
@Setter自动添加 setter 方法
@ToString自动添加 tostring 方法
@EqualsAndHashCode自动添加equals 和 hashCode 方法
@NoArgsConstructor自动添加无参构造方法
@AllArgsConstructor自动添加全属性构造方法,顺序按照属性的定义顺序
@NonNull属性不能为 null
@RequiredArgsConstructor自动添加必须属性构造方法,final + @NonNull 的属性为必需
public class Student {
    private Integer id;
    @Setter
    private String name;
    private Integer age;
}
public class Student {
    private Integer id;
    @Setter @Getter
    private String name;
    private Integer age;
}
@Setter @Getter
public class Student {
    private Integer id;
    private String name;
    private Integer age;
}

类注解/属性注解:类注解:所有的属性都具备了对应注解的方法。

如果类加上了 @Setter,所有的属性都有了 set 方法;

如果类加上了 @Getter,所有的属性都有了 get 方法。

这两个注解可以单独使用。

如果该注解加在了属性上,对应的属性就有了 get/set 方法。

6.2 组合注解

注解作用
@Data@Getter + @Setter + @ToString + @EqualsAndHashCode + @NoArgsConstructor + @RequiredArgsConstructor

6.3 日志注解

注解作用
@Slf4j添加一个名为 log 的日志,使用 slf4j

7. 总结

日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot 内容了日志框架, 默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过 lombok 提供的 @Slf4j 注解 和 log 对象快速的打印自定义日志,日志包含 6 个级别:

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

日志级别依次提升,而日志界别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志永久地保存下来。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/800225.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

达梦数据库-下载安装、基本操作及报错处理

下载安装 懒得记官网直接上网搜 产品下载-达梦数据 里面我是按图选择的Dm8 X86 Win64 下载完成后 解压 得到两个文件,打开上面这个ISO文件 打开安装包 setup.exe 这里默认选择中国时间 根据指示一步一步安装即可 选择刚刚安装的DM管理工具即可进入 基本操作 -- 获取所有…

SOLIDWORKS PDM只读文件的处理方法

如果用户检出一个文件,该文件在 SolidWorks 或其他应用程序中仍然以只读形式装入,最常见的原因包括: 1. 核实正在检出的文件尚未在现有 SolidWorks 进程中以只读方式打开。 这是一个常见错误,用户已经在 SolidWorks 打开了装配体…

MySQL界面客户端及高级的复杂查询

十五、MySQL界面客户端 十六、高级的复杂查询 1、查询去重 2、分组查询 gender和name没有同时相同的,相当于没分组 3、别名的使用 4、分组后的筛选 5、排序 6、分页 7、查询的顺序

Vue源码学习 - 异步更新队列 和 nextTick原理

目录 前言一、Vue异步更新队列二、nextTick 用法三、原理分析四、nextTick 源码解析1)环境判断2)nextTick() 五、补充 前言 在我们使用Vue的过程中,基本大部分的 watcher 更新都需要经过 异步更新 的处理。而 nextTick 则是异步更新的核心。…

【能量管理系统( EMS )】基于粒子群算法对光伏、蓄电池等分布式能源DG进行规模优化调度研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

基于量子同态加密的安全多方凸包协议

摘要安全多方计算几何(SMCG)是安全多方计算的一个分支。该协议是为SMCG中安全的多方凸包计算而设计的。首先,提出了一种基于量子同态加密的安全双方值比较协议。由于量子同态加密的性质,该协议可以很好地保护量子电路执行过程中数据的安全性和各方之间的…

分享一套功能齐全的免费开源MES系统

万界星空科技的开源MES功能: 1、基础数据管理: 2、质量管理: 质检项目维护,根据物料或者型号管理质检项目。检验页面,抽检确认。 3、工艺文件管理 :工艺参数,BOM文件,导入导出 报表&…

【树莓派入门】

一、镜像烧录 烧录器:Raspberry Pi Imager 下载链接:树莓派镜像烧录器下载 创建 ssh 文件 手动创建一个空白记事本.txt文件,命名为ssh,重命名,删掉.txt扩展名。将这个文件放入SD卡的boot盘中 wpa_supplicant.conf …

电流源电路

3.3.3电流源电路 镜像电流源 电路 分析 仿真 比例电流源 电路 分析 仿真 加射极输出器的电流源1 电路 分析 仿真 加射极输出器的电流源2 电路 分析 仿真 威尔逊电流源 电路 分析 仿真

Docker 全栈体系(八)

Docker 体系(高级篇) 六、Docker轻量级可视化工具Portainer 1. 是什么 Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 2. 安装 官网 https://www.portain…

QTday3消息弹框/计时器

闹钟小软件 widget.cpp #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QDebug> #include <QPushButton> #include <QLabel> #include <QTimer> #include <QTimerEvent> #include <QTime> #include <QMessageB…

版本适配好帮手 Android SDK Upgrade Assistant / Android Studio Giraffe新功能

首先是新版本一顿下载↓&#xff1a; Download Android Studio & App Tools - Android Developers 在Tools中找到Android SDK Upgrade Assistant 可以在此直接查看SDK升级相关信息&#xff0c;不用跑到WEB端去查看了。 例如看一下之前经常要对老项目维护的android 12蓝牙…

umy-ui树形结构表格懒加载用法详解

效果图 在做后台时&#xff0c;使用的iview组件库中的树形表格&#xff0c;但数据量过大时会导致页面卡死&#xff0c;借助umy-ui的虚拟表格完美解决了数据量大卡顿的问题。 先放文档&#xff1a;http://www.umyui.com/umycomponent/u-table-column-api 安装 npm install u…

Ubuntu Server版 之 mysql 系列

Ubuntu 分 桌面版 和 服务版 桌面版 &#xff1a;有额外的简易界面 服务版&#xff1a;是纯黑框的。没有任何UI界面的可言 安装mysql 安装位置 一般按照的位置存放在 /usr/bin 中 sudo apt-get install mysql-server查看mysql的状态 service mysql status mysql 安全设置…

对原型、原型链的理解

在 JavaScript 中是使用构造两数来新建一个对象的&#xff0c;每一个构造函数的内部都有一个 prototype 属性&#xff0c;它的属性值是一个对象&#xff0c;这个对象包含了可以由该构造西数的所有实例共享的属性和方法。当使用构造函数新建一个对象后&#xff0c;在这个对象的内…

js加载和长任务

js加载和长任务 本文将讲解以下浏览器如何加载js&#xff0c;并介绍一些可以提高网页加载速度的方法。 Evaluate Script 如果我们在devtools的performance中分析过网站的加载性能&#xff0c;可能会看到一个很长的任务&#xff0c;叫做Evaluate Script. 在这种情况下&#x…

IDS(Intrusion Detection Systems)

计算机安全的三大中心目标是&#xff1a;保密性(Conf idential ity)、完整性(Integrity)、可用性(Availability)。 身份认证与识别、访问控制机制、加密技术、防火墙技术等技术共同特征就是集中在系统的自身加固和 防护上&#xff0c;属于静态的安全防御技术&#xff0c;缺乏主…

【微服务架构设计】微服务不是魔术:处理超时

微服务很重要。它们可以为我们的架构和团队带来一些相当大的胜利&#xff0c;但微服务也有很多成本。随着微服务、无服务器和其他分布式系统架构在行业中变得更加普遍&#xff0c;我们将它们的问题和解决它们的策略内化是至关重要的。在本文中&#xff0c;我们将研究网络边界可…

上门居家养老小程序社区养老小程序开发方案详解

居家养老管理社区养老小程序有哪些功能呢&#xff1f; 1.选择养老服务类型 医疗护理&#xff0c;家政服务预约&#xff0c;上门助浴、上门做饭&#xff0c;上门助餐&#xff0c;生活照护&#xff0c;康复理疗、精神慰藉、委托代办等。各项服务的详情介绍。 2.选择预约时间 选择…

Linux_NVR_SDK 编译应用 -基于iTOP-RK3568开发板

在源码 build/app 目录下有发布版本的 RKMPI 以及编译配置&#xff0c;目前的编译方式只支持 Cmake 脚本。如果要编译其他应用&#xff0c;可以参考 build/app/build/build.sh 脚本配置编译工具链。 以编译 RKMPI 应用程序为例&#xff0c;进行示范&#xff1a; 1. 使能 sdk…