8. Spring Boot 日志文件

目录

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:致命的,因为代码异常导致程序退出执行的事件。

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

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《Docker与持续集成/持续部署:构建高效交付流程,打造敏捷软件交付链》

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Qt5.14.2+VS2019配置MSVC2017

问题: The compiler " Microsoft Visual C Compiler 16 . 11 . 32106 . 194 ( amd64 x86 )( x86-windows-msvc2019-pe-32bit ) cannot produce code for the Qt version " Qt5.14.2 MSVC2017 64bit " ( x86-windows-msvc2017-pe-64bit 编译器“…

区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiGRU双向门控循环单元分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 MATLAB实现QRBiGRU双向门控循环单元分位数回归…

选读SQL经典实例笔记14_层次查询

1. 结果集 1.1. sql select empno,mgrfrom emp order by 2EMPNO MGR ---------- ----------7788 75667902 75667499 76987521 76987900 76987844 76987654 76987934 77827876 77887566 78397782 7…

Hadoop生态体系-2

目录标题 1、MapReduce介绍2、数据仓库3、HIVE4、HQL4.1 hive读写文件机制4.2 Hive数据存储路径 1、MapReduce介绍 思想:分而治之 map:“分”,即把复杂的任务分解为若干个“简单的任务”来处理。可以进行拆分的前提是这些小任务可以并行计算&#xff0c…

第四章 HL7 架构和可用工具 - 查看数据结构

文章目录 第四章 HL7 架构和可用工具 - 查看数据结构查看数据结构查看代码表使用自定义架构编辑器 第四章 HL7 架构和可用工具 - 查看数据结构 查看数据结构 当单击“数据结构”列中的名称时,InterSystems 会显示该数据结构中的所有字段。这是 HL7 数据结构页面。…

网络安全法律法规

数据参考:CISP官方 目录 国家立法体系网络安全法解析网络安全相关法律 一、国家立法体系 1、我国的立法体系 我国的立法体系在网络空间治理中扮演着基础工作的角色。为了应对快速发展的网络技术和威胁,我国采取了多级立法机制来完善网络空间的法律…

在linux中怎样同时运行三个微服务保证退出时不会终止

前言 1.maven中打jar包 使用插件打包,必须在pom.xml中添加插件,否则不能在linux中编译运行 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version&g…

207. 课程表 Python

文章目录 一、题目描述示例 1示例 2 二、代码三、解题思路 一、题目描述 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, …

网络安全大厂面试题

自我介绍 有没有挖过src&#xff1f; 平时web渗透怎么学的&#xff0c;有实战吗&#xff1f;有过成功发现漏洞的经历吗&#xff1f; 做web渗透时接触过哪些工具 xxe漏洞是什么&#xff1f;ssrf是什么&#xff1f; 打ctf的时候负责什么方向的题 为什么要搞信息安全&#xff0c;对…

华为数通HCIP-BGP EVPN基础

MP-BGP MP-BGP&#xff08;Multiprotocol Extensions for BGP-4&#xff09;在RFC4760中被定义&#xff0c;用于实现BGP-4的扩展以允许BGP携带多种网络层协议&#xff08;例如IPv6、L3VPN、EVPN等&#xff09;。这种扩展有很好的后向兼容性&#xff0c;即一个支持MP-BGP的路由…

饱和(非饱和)激活函数

1.什么是饱和&#xff08;非饱和&#xff09;激活函数 若h(x)满足&#xff1a;&#xff0c;则h(x)称为饱和激活函数&#xff0c;例如sigmoid和tanh&#xff0c;否则为非饱和激活函数&#xff0c;例如Relu及其变体。 2.非饱和激活函数的优势有两点 能解决所谓的“梯度消失”问…

【小尘送书-第三期】Python机器学习:基于PyTorch和Scikit-Learn 》

大家好&#xff0c;我是小尘&#xff0c;欢迎关注&#xff0c;一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的实习&#xff01; 本文目录 一、前言二、作者简介三、内容简介四、抽奖方式 一、前言 近年来&#xff0…

VLAN---虚拟局域网

VLAN— 虚拟局域网 LAN—局域网 MAN—城域网 WAN—广域网 1.一个VLAN相当于是一个广播域 VLAN—通过路由器和交换机协同工作后&#xff0c;将原本的一个广播域逻辑上&#xff0c;拆 分为多个虚拟的广播域。 VLAN配置&#xff1a; 1.创建VLAN VID—VLAN ID------用来区分和…

git相关

gerrit用户指南&#xff1a; 资料&#xff1a;Gerrit 用户指南 gerrit-user-guide 上述有介绍如何review&#xff0c;review并非修改代码之后如何重新提交等操作 jenkins介绍 Jenkins详细教程 - 知乎 一、jenkins是什么&#xff1f; Jenkins是一个开源的、提供友好操作界…

【手机】三星手机刷机解决SecSetupWizard已停止

三星手机恢复出厂设置之后&#xff0c;出现SecSetupWizard已停止的解决方案 零、问题 我手上有一部同学给的三星 GT-S6812I&#xff0c;这几天搞了张新卡&#xff0c;多余出的卡就放到这个手机上玩去了。因为是获取了root权限的&#xff08;直接使用KingRoot就可以&#xff0…

基于JAVA SpringBoot和Vue高考志愿填报辅助系统

随着信息技术在管理中的应用日益深入和广泛&#xff0c;管理信息系统的实施技术也越来越成熟&#xff0c;管理信息系统是一门不断发展的新学科&#xff0c;任何一个机构要想生存和发展&#xff0c;要想有机、高效地组织内部活动&#xff0c;就必须根据自身的特点进行管理信息时…

Java网络编程(二)流

网络程序所做的很大一部分工作都是简单的输入和输出:将数据字节从一个系统移动到另一个系统。字节就是字节。在很大程度上讲&#xff0c;读取服务器发送给你的数据与读取文件并没什么不同。向客户端发送文本与写文件也没有什么不同。但是&#xff0c;Java中输入和输出(I/O)的组…

springboot创建并配置环境(一) - 创建环境

文章目录 一、介绍二、启动环境Environment的分析三、进入源码四、创建环境1. 如何确定应用类型2. 测试 一、介绍 在springboot的启动流程中&#xff0c;启动环境Environment是可以说是除了应用上下文ApplicationContext之外最重要的一个组件了&#xff0c;而且启动环境为应用…

ubuntu20.04 安装 docker engine

打开docker官网 点击上图中间的Linux&#xff0c;会是这样&#xff1a; 点击上图的左边栏的 Docker Engine,点击install, 点击 Ubuntu&#xff0c;会是这样&#xff1a; 把页面翻下来&#xff0c;先按照 Insstallation methods 中的 set up thre repository&#xff0c;执行这些…