【JavaEE】Spring Boot - 日志文件

【JavaEE】Spring Boot 开发要点总结(3)

在这里插入图片描述

文章目录

  • 【JavaEE】Spring Boot 开发要点总结(3)
    • 1. 日志有什么作用
    • 2. 日志格式
      • 2.1 日志框架原理
    • 3. 日志的打印
      • 3.1 System.out.println
      • 3.2 使用日志框架
      • 3.3 日志级别
        • 3.3.1 设置默认日志显示阈值
        • 3.3.2 针对一个目录设置日志显示阈值
    • 4. 日志持久化
      • 4.1 设置日志保存路径
      • 4.2 设置日志打印格式
      • 4.3 设置日志文件名
      • 4.4 面临的问题
    • 5. lombok框架
      • 5.1 节省重复简单代码的书写
      • 5.2 快速读写日志文件
      • 5.3 lombok实现原理

【JavaEE】Spring Boot 开发要点总结(3)

1. 日志有什么作用

写代码不是概率事件,bug的出现必然是有原因的,而日志的主要作用就是,排查和定位问题!

  • 而日志的生成就是随着程序的进行和一步步生成的,不说全部过程都记录得清清楚楚,至少重要的点和环节或者一些异常情况都有记录
  • 而通过日志的 “前后逻辑分析、类型级别、日志内容信息” ,就可以定位和排查了
  • 就比如我们之前写普通 java 代码在控制台打印的信息和调试页面的信息差不多,都是让我们知道程序执行的过程怎么样~

除此之外,我们还能实现以下功能:

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

例如,启动项目的时候,控制台显示的就是,日志,标准的日志:

在这里插入图片描述

而且这些标准的日志,都是有固定格式的~

三个问题:

  1. Spring Boot 内置了日志框架,才能按照固定格式输出日志, 这些信息代表什么呢?
    • 格式并不需要开发者去设计
  2. 默认情况下,项目输出的日志并非开发者自定义和打印的,Spring框架在运行时会自动打印一些日志, 如何自定义打印日志呢?
    • 格式有了,内容和打印时机还是需要自定义的
  3. 日志默认是打印在控制台, 如何实现持久化呢?
    • 控制台的,重新运行就会清空,日志得保存下来,才有意义,后续才能查阅

2. 日志格式

在这里插入图片描述

这就是日志框架提供的格式,提供的信息还是很全面的!

2.1 日志框架原理

Spring Boot之所以可以打印日志,是因为内置了两个日志框架:

  1. slf4j

    在这里插入图片描述

  2. logback

为什么需要两个呢?

  1. slf4j 是开发者使用和调用的框架
  2. logback 最底层实现日志相关操作的框架
  • 其实这里的思想跟 JQuery 和 JDBC 的思想差不多
    • 多种浏览器统一满足JQuery,开发者统一地使用开发API,浏览器怎么识别代码展示出来的与开发者无关
    • 多种数据库统一满足JDBC,开发者统一地使用开发API,底层怎么实现数据持久化与开发者无关
  • 一种 低耦合高内聚 的分工

而这里,多种底层实现日志相关操作的框架统一支持slf4j,开发者统一地使用开发API,底层怎么实现日志相关操作的与开发者无关

  • logback就是其中一种底层框架

后面设置日志级别,通过日志级别筛选 …等操作,底层由框架帮我们去实现,对于开发者,这些“坐享其成”的事太多了,我们要专心开发,不必可以他们的存在

3. 日志的打印

3.1 System.out.println

这是我们普通java程序的日志打印方式,效果平庸,信息很少:

在这里插入图片描述

运行后,浏览器访问:

在这里插入图片描述

查看控制台:

在这里插入图片描述

如果要打印时间:

在这里插入图片描述

效果:

在这里插入图片描述

其他的信息获取和组织起来就更加麻烦了~

  • 而自己去加日志级别没有作用,你只是拼接了字符串罢了
  • 这样就检索不了

并且对于后面第三个持久化的问题,sout的日志无法持久化保存

3.2 使用日志框架

程序能够启动并且能打印日志,就什么这个框架已经引入进来了,只需要以下操作:

  1. 获取日志工厂
    • 生成一个日志制造器

在这里插入图片描述

一定要选择,slf4j框架的类

在这里插入图片描述

  • 这里就涉及到了工厂模式,通过工厂类LoggerFactory去获取实例对象
    • 能猜到,传过去的类对象,就是对应“包名+类名”的那一段信息
  1. 调用方法进行打印

在这里插入图片描述

在这里插入图片描述

访问一下试试:

在这里插入图片描述

可见,通过框架提供的API,就可以有效地设置日志级别,方法名对应的就是日志级别~

  • 并且,日志格式跟系统日志一模一样~

但是,为什么我们打印了五条,却只显示三条呢?

  • 这就是对日志级别的筛选操作

3.3 日志级别

  1. trace:微量、少许、痕迹,级别最低
  2. debug:调试日志级别
  3. info:普通日志级别
  4. warn:警告日志级别
  5. error:错误日志级别
  6. fatal:致命日志级别
    • 只有系统崩溃时才会输出的日志级别,并没有fatal( )方法
    • 级别最高

从上到下,日志级别递增!

而系统如何筛选日志的呢?

  • 可见,我们啥也没设置的情况下,显示阈值是info,只显示跟info同级或者比info级别高的日志 => ≥info
  • 这也是一种筛选~

在这里插入图片描述

而我们去筛选的话,就是根据这个原理,去设置默认显示阈值

3.3.1 设置默认日志显示阈值

在这里插入图片描述

效果:

在这里插入图片描述

  • 看似没有启动成功,其实是因为trace和debug的日志太多了!
  • 所以我们筛查的应该是≥info,≥warn,≥error的

在这里插入图片描述

效果:

在这里插入图片描述

  • info不显示了

在这里插入图片描述

  • 显示 ≥warn 的日志了~

日志级别的作用就是:过滤信息

  • 将不需要的日志屏蔽掉

根据其他信息进行筛选排查的话,之后需要用到就去学~

3.3.2 针对一个目录设置日志显示阈值

在这里插入图片描述

要求:对于controller目录,显示阈值为info;对于model目录,显示阈值为error

在这里插入图片描述

  • logging.level.[路径]
    • 代表设置该路径下以及其子目录的日志显示阈值
    • 其实设置默认日志显示阈值也是这个原理,代表设置root目录下的所有…
  • 不过,越细致的优先级越高

在这里插入图片描述

效果:

在这里插入图片描述

4. 日志持久化

日志持久化,就是把日志保存到文件里,也就是保存到电脑磁盘里,后续在文件里去观看,可以通过文本编辑器进行一些查找查看~

配置项不懂的,可以去官方文档中解惑:Common Application Properties (spring.io)

  • 以下内容只涉及部分,要想了解更多,阅读文档!

4.1 设置日志保存路径

不需要设置“要不要保存”的选项,因为设置了后还是需要给一个保存路径,还不如直接设置路径,就代表了两种含义

  1. 需要保存日志
  2. 保存日志的地址

在这里插入图片描述

  • 保存到D盘的马库目录里:

控制台:

在这里插入图片描述

文件目录:

在这里插入图片描述

  • 默认名为spring,类型为.log文件

  • 并且目录不存在会自动创建

    在这里插入图片描述

    这个属性不能设置文件名

在这里插入图片描述

多按几下浏览器刷新:

在这里插入图片描述

以追加的方式更新:

在这里插入图片描述

4.2 设置日志打印格式

在这里插入图片描述

比如这个毫秒,我不喜欢,我要把他去掉:

在这里插入图片描述

效果:

在这里插入图片描述

日志文件里:
在这里插入图片描述

并不会更新之前的内容,而是往后去追加~

补充:
在这里插入图片描述

  • 删除几条信息后按,Ctrl s
    在这里插入图片描述

log文件修改后不能保存,只能另存为或者选择替换原本的文件

4.3 设置日志文件名

在这里插入图片描述

在这里插入图片描述

好像不符合预期猜想,key.log在哪:

在这里插入图片描述

原来在这儿~

所以path和name不能搭配~

  • 这样生成的日志文件有两个~

而name对应的被认为是相对路径,就保存到项目目录里了

在这里插入图片描述

  • 改为具体位置~

在这里插入图片描述

  • perfect!

在这里插入图片描述

4.4 面临的问题

  1. 追加的方式去写到文件里的,那么一直这样下去,会不会文件太大,磁盘炸了?!
  2. 文件太大,查看不方便,打开特别慢

给文件设置极限大小

  • 日志框架里是有默认的大小限制的

在这里插入图片描述

  • 如果不进行配置,日志文件达到一定的大小,就会重新创建一个新文件,在原文件名加上后缀(比如时间),后续的日志追加到这个新文件里

当然,这些效果的实现,不止这一种做法,也还有更多的效果可以实现,可以去官方文档中阅读学习,之后遇到需要实现的效果,专门去查即可

5. lombok框架

Lombok虽然不是IDEA的“兄弟产品”,但是却能摆在一开始选择依赖的页面里:
在这里插入图片描述

说明这并不是等闲之辈,很多公司都在用

而它出现就是为了快速开发java项目的!

  • 当然每个框架都是这样的
  • 那么Lombok究竟好用在哪呢?

5.1 节省重复简单代码的书写

在这里插入图片描述

对于这些老朋友方法,我们再熟悉不过了,这些代码的特点就是,必要但是简单并且属性如果比较多,代码就会特别长

而Lombok框架提供的注解,很好的解决了这个问题:

  • 注解帮助我们实现很多逻辑,甚至控制我们的操作显示,功能很强大
  • 它不像一些API的类和方法参与到代码里,而是加在旁边,对我们进行强大的辅助,冥冥之中发挥强大的功能!

下载lombok插件和引入依赖:

在这里插入图片描述

在这里插入图片描述

其实在创建项目的时候就引入了,并且如果没有安装插件,也会自动帮你安装~

注解介绍:

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

属性越多,构造方法的个数呈阶乘倍数增加,所以全部都加上是不现实的,并且没多大必要,并不需要每个都存在~

如果你觉得不够简洁,还可以用 注解@Data,它等同于:

@Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor + @NoArgsConstructor

等于这一整套~

在这里插入图片描述

当然,你自己写的代码,会覆盖原有的~

5.2 快速读写日志文件

同样的,用到注解

在这里插入图片描述

这样后,在类的内部就可以直接使用一个静态常量 log 了,代表的就是日志制造器

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.3 lombok实现原理

java程序执行的流程:

在这里插入图片描述

而Lombok就是在编码的时候,减轻了.java用户代码的负担:

在这里插入图片描述

我们没有书写对应的 log 以及Getter和Setter…,但是Lombok帮我们在.class里去添加了对应的字节码:

在这里插入图片描述

在这里插入图片描述

而那个小辣椒插件,是不可或缺的存在,因为没有它,我们在开发阶段,就会被系统判定没有对应的定义,以至于爆红,没有题词…

  • 插件不等同于框架,插件的存在是在开发上和视觉上的提升
  • 例如虽然class文件里有定义,但你现在的java代码上确实没有对应的定义,却可以使用,有题词,且不会爆红,这就是插件的帮助,将一些注解的含义“告诉”编译器,一些东西算他们定义过了~
  • 插件的复杂实现,不是开发者需要注意的,“坐享其成即可” (>^ ω ^<)

文章到此结束!谢谢观看
可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆

代码位置:spring_boot_demo2/src/main · 游离态/马拉圈2023年8月 - 码云 - 开源中国 (gitee.com)


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

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

相关文章

深度学习(36)—— 图神经网络GNN(1)

深度学习&#xff08;36&#xff09;—— 图神经网络GNN&#xff08;1&#xff09; 这个系列的所有代码我都会放在git上&#xff0c;欢迎造访 文章目录 深度学习&#xff08;36&#xff09;—— 图神经网络GNN&#xff08;1&#xff09;1. 基础知识2.使用场景3. 图卷积神经网…

提高测试用例质量的6大注意事项

在软件测试中&#xff0c;经常会遇到测试用例设计不完整&#xff0c;用例没有完全覆盖需求等问题&#xff0c;这样往往容易造成测试工作效率低下&#xff0c;不能及时发现项目问题&#xff0c;无形中增加了项目风险。 因此提高测试用例质量&#xff0c;就显得尤为重要。一般来说…

电脑开不了机如何解锁BitLocker硬盘锁

事情从这里说起&#xff0c;不想看直接跳过 早上闲着无聊&#xff0c;闲着没事干&#xff0c;将win11的用户名称改成了含有中文字符的用户名&#xff0c;然后恐怖的事情发生了&#xff0c;蓝屏了… 然后就是蓝屏收集错误信息&#xff0c;重启&#xff0c;蓝屏收集错误信息&…

C#小轮子:自动连续Ping网络地址

文章目录 前言Ping代码异步问题 前言 工作中&#xff0c;我们经常用到Ping这个指令&#xff0c;有时候我们需要Ping整个网段来查看这个网段上面有什么设备&#xff0c;哪些Ip地址是通的&#xff0c;这个时候就需要Ping指令 Ping 代码 我这个是批量Ping的代码&#xff0c;而…

python爬虫实战(2)--爬取某博热搜数据

1. 准备工作 使用python语言可以快速实现&#xff0c;调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义url url https://s.微博.com/top/summary?caterealtimehot定义请求头&#xff0c;微博请求数据需要cookie…

OpenAI允许网站阻止其网络爬虫;谷歌推出类似Grammarly的语法检查功能

&#x1f989; AI新闻 &#x1f680; OpenAI推出新功能&#xff0c;允许网站阻止其网络爬虫抓取数据训练GPT模型 摘要&#xff1a;OpenAI最近推出了一个新功能&#xff0c;允许网站阻止其网络爬虫从其网站上抓取数据训练GPT模型。该功能通过在网站的Robots.txt文件中禁止GPTB…

datax抽取库名带点的表遇到的问题

一、描述任务 使用Datax抽取mysql中的数据到hive的wedw_ods层中&#xff0c;mysql的库名为&#xff1a;b.p.n.p 表名为&#xff1a;bene_group 二、datax.json脚本生成 因为datax的脚本是自动生成的&#xff0c;生成的格式如下&#xff1a; {"core": {},"jo…

python接口自动化测试框架2.0,让你像Postman一样编写测试用例,支持多环境切换、多业务依赖、数据库断言等

项目介绍 接口自动化测试项目2.0 软件架构 本框架主要是基于 Python unittest ddt HTMLTestRunner log excel mysql 企业微信通知 Jenkins 实现的接口自动化框架。 前言 公司突然要求你做自动化&#xff0c;但是没有代码基础不知道怎么做&#xff1f;或者有自动化…

部署模型并与 TVM 集成

本篇文章译自英文文档 Deploy Models and Integrate TVM tvm 0.14.dev0 documentation 更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架&#xff0c;适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站 本节介绍如何将 TVM 部署到各种平台&…

搭建Repo服务器

1 安装repo 参考&#xff1a;清华大学开源软件镜像站:Git Repo 镜像使用帮助 2 创建manifest仓库 2.1 创建仓库 git init --bare manifest.git2.2 创建default.xml文件 default.xml文件内容&#xff1a; <?xml version"1.0" encoding"UTF-8" ?…

基于Googlenet深度学习网络的人员行为动作识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1. 原理 1.1 深度学习与卷积神经网络&#xff08;CNN&#xff09; 1.2 GoogLeNet 2. 实现过程 2.1 数据预处理 2.2 构建网络模型 2.3 数据输入与训练 2.4 模型评估与调优 3. 应用领域…

STM32 LL库开发

一、STM32开发方式 标准库开发&#xff1a;Standard Peripheral Libraries&#xff0c;STDHAL库开发&#xff1a;Hardware Abstraction Layer&#xff0c;硬件抽象层LL库开发&#xff1a;Low-layer&#xff0c;底层库 二、HAL库与LL库开发对比 ST在推行HAL库的时候&#xff0c;…

C# Linq源码分析之Take方法

概要 Take方法作为IEnumerable的扩展方法&#xff0c;具体对应两个重载方法。本文主要分析第一个接收整数参数的重载方法。 源码解析 Take方法的基本定义 public static System.Collections.Generic.IEnumerable Take (this System.Collections.Generic.IEnumerable source…

【uniapp】uniapp使用微信开发者工具制作骨架屏:

文章目录 一、效果&#xff1a;二、过程&#xff1a; 一、效果&#xff1a; 二、过程&#xff1a; 【1】微信开发者工具打开项目&#xff0c;生成骨架屏&#xff0c;将wxml改造为vue页面组件&#xff0c;并放入样式 【2】页面使用骨架屏组件 【3】改造骨架屏&#xff08;去除…

以mod_jk方式整合apache与tomcat(动静分离)

前言&#xff1a; 为什么要整合apache和tomcat apache对静态页面的处理能力强&#xff0c;而tomcat对静态页面的处理不如apache&#xff0c;整合后有以下好处 提升对静态文件的处理性能 利用 Web 服务器来做负载均衡以及容错 更完善地去升级应用程序 jk整合方式介绍&#…

项目知识点记录

1.使用druid连接池 使用properties配置文件&#xff1a; driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…

【验证码逆向专栏】最新某度旋转验证码 v2 逆向分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未…

2021年09月 C/C++(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

第1题:数字判断 输入一个字符,如何输入的字符是数字,输出yes,否则输出no 输入 一个字符 输出 如何输入的字符是数字,输出yes,否则输出no 样例1输入 样例1输入 5 样例1输出 yes 样例2输入 A 样例2输出 no 下面是一个使用C语言编写的数字判断程序的示例代码,根据输入的字符…

怎么入驻抖音的产业带服务商呢?

作为互联网行业中的明星企业之一&#xff0c;抖音电商近年来一直备受市场瞩目&#xff0c;甚至于某种角度而言&#xff0c;围绕抖音电商的研究和解读已成为一门“显学”。 如果说2021年之前&#xff0c;抖音试水电商业务的方式大多以主播、品牌及商家申请找cmxyci自发摸索为主…

实践|Linux 中查找和删除重复文件

动动发财的小手&#xff0c;点个赞吧&#xff01; 如果您习惯使用下载管理器从互联网上下载各种内容&#xff0c;那么组织您的主目录甚至系统可能会特别困难。 通常&#xff0c;您可能会发现您下载了相同的 mp3、pdf 和 epub&#xff08;以及各种其他文件扩展名&#xff09;并将…