当前位置: 首页 > news >正文

【 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 项⽬在启动的时候默认就有⽇志输出,如下图所示:

在这里插入图片描述

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

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

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

三、⾃定义⽇志打印

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

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

3.1 在程序中得到⽇志对象

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

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

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

注意: Logger 对象是属于 org.slf4j 包下的,不要导⼊错包
在这里插入图片描述

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

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

在这里插入图片描述

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


3.2 使⽤⽇志对象打印⽇志

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

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

打印⽇志效果展示:

在这里插入图片描述

3.3 ⽇志格式说明

在这里插入图片描述

四、⽇志级别

4.1 ⽇志级别的作用

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

在这里插入图片描述

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

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

4.2 ⽇志级别的分类与使⽤

4.2.1 ⽇志级别的分类

⽇志的级别分为:

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

⽇志级别的顺序:

在这里插入图片描述

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

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");}

运行结果如下:

在这里插入图片描述

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


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

在这里插入图片描述

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

在这里插入图片描述

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

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


4.2.2.3 更简单的⽇志输出—lombok

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

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

在这里插入图片描述

4.2.2.3.1 如何在程序开发中途去添加一个框架依赖?
  1. 添加插件 Edit Starters
  2. 在 pom.xml 中右击鼠标点击 Generate
    在这里插入图片描述

  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 文件查看源码如下:

在这里插入图片描述

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

在这里插入图片描述


lombok 更多注解说明:

基本注解:

在这里插入图片描述

组合注解:

在这里插入图片描述

日志注解:

在这里插入图片描述

五、⽇志持久化

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

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

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

运行 UserController 类效果如下:

在这里插入图片描述

打开该文件夹观察:

在这里插入图片描述

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

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

再次运行,效果如下:

在这里插入图片描述

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


六、总结

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

相关文章:

【 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 配置局部文件夹的日志…...

ThinkPHP路由不转换的原因及解决方法

随着互联网的发展,网站开发技术日新月异。而ThinkPHP作为一款流行的PHP开发框架之一,也在不断地吸纳更多的开发者来使用。然而,有时候我们在使用过程中会遇到一些问题,比如ThinkPHP路由不转换的问题。本文将详细介绍这个问题以及解…...

【案例教程】基于RWEQ模型的土壤风蚀模数估算及其变化归因分析实践技术

土壤风蚀是一个全球性的环境问题。中国是世界上受土壤风蚀危害最严重的国家之一,土壤风蚀是中国干旱、半干旱及部分湿润地区土地荒漠化的首要过程。中国风蚀荒漠化面积达160.74104km2,占国土总面积的16.7%,严重影响这些地区的资源开发和社会经…...

Twitter推荐算法总架构和算法说明

Twitter推荐算法总架构: 这个推荐架构的作用是生成在用户首页上显示的推文列表 步骤: 1、从不同的推荐来源中获取最好的推文,这个过程被称为候选来源。 2、使用机器学习模型对每条推文进行排名。 3、应用启发式方法和过滤器,例如…...

1.C语言题目---指针类(基础)

1. 小端,低地址存低字节,高地址存高字节 大端,低地址存高字节,高地址存低字节 人类读写数据习惯是大端字节序 比如说数字12345678在寄存器大端存储顺序如下: 在寄存器小端存储顺序如下: 假设,a变量的地址为0x64,则a变量在内存中的模型为: 0…...

【算法与数据结构】关于排序的问题思考

文章目录引言不断的插入值,并保证序列是递增的。Python中sort()和sorted()的区别是啥?sorted 函数如何使用?问题: 如何返回排序之后的索引问题:排序的稳定性问题,寻找第K大的元素的算法。引出一个算法题&am…...

行为型模式-命令模式

行为型模式-命令模式命令模式(Command)解决命令执行问题描述适用环境优点:缺点:违反原则:代码实现命令模式(Command) 解决命令执行问题 描述 将一个请求封装为一个对象,并定义该对…...

SHELL综合练习1

文章目录1、编写函数,实现打印绿色OK和红色FAILED 判断是否有参数,存在为Ok,不存在为FAILED2、 编写函数,实现判断是否无位置参数,如无参数,提示错误3、编写函数实现两个数字做为参数,返回最大值…...

ROS开发之如何使用发布者、订阅者和话题消息?

文章目录0、引言1、创建发布者(velocity发布者 →geometry话题消息→turtlesim订阅者)2、创建订阅者(turtlesim发布者→turtlesim话题消息→pose订阅者)3、自定义话题消息4、使用自定义话题消息(person发布者→自定义话…...

基于Java+Springboot+vue高校资源共享交流平台设计和实现

博主介绍:✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…...

收藏! 38个Python数据科研库

通用的数据科学库,即那些可能被数据科学领域的从业人员用于广义的,非神经网络的,非研究性工作的库: 数据-用于数据管理,处理和其他处理的库 数学-虽然许多库都执行数学任务,但这个小型库却专门这样做 机…...

SpringBoot过滤器获取Bean-请求重复可读-获取请求体数据-用户IP归属地获取

文章目录一.获取Bean二. Request重复可读三. 过滤器获取Body请求体数据四.用户ip获取一.获取Bean 网上一些论调说Filter无法注入Bean的原因是加载顺序: listener—>filter—>servlet导致的.我不赞同. 原因:默认机制下,在SpringBoot应用启动时,IOC…...

有哪些特别小众而有趣的编程语言呢?

相对较小众的编程语言,还要有趣?发表一些个人看法,如果不对大家口味,大家轻喷,留情留情。 Rust:Rust是一种系统编程语言,致力于提供高性能、可靠性和安全性。Rust具有内存安全和线程安全的特性&…...

vue中使用高德

首先我们要申请高德地图的key,当前升级过后高德地图使用也需要加上安全秘钥 注册账号 访问高德地图开发平台根据实际情况填写就可以🍜(实名认证的时候选择个人就可以,如果是企业级的项目,可能会涉及人员变动&#xf…...

React class组件和hooks setState异步更新数据详解

一、 class组件setState详解 1.class组件setState异步更新数据详解 class Father extends React.Component{state {num:0}addHandler () > { this.setState({num: 100})console.log(state中的值,this.state.num)}render() { return (<div><button onClick{this…...

ToBeWritten之嵌入式操作系统

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

git 实际开发中使用-解决问题

前言 git代码版本管理工具&#xff0c;打破常规的物理传输&#xff0c;更新&#xff0c;合并&#xff0c;回滚提高了开发效率和可追溯性。 网上的资料会把所有的命令都很全也很多&#xff0c;导致对刚刚了解的同学不友好&#xff0c;很难实际使用。 每个人都有自己使用git的习…...

新星计划·2023-第1期 - Python赛道报名入口 -〖你就是下一个新星〗

↓↓↓报名方式&#xff1a;&#xff08;下滑到本页面底部&#xff09;重要提醒&#xff1a;这里是 新星计划2023-第1期 - Python赛道报名入口&#xff0c;一经报名&#xff0c;不可更换。报名入口点击此处跳转 一、新星计划 新星计划是一个以发掘潜力新人、培养优质博主为目…...

Android LowMemoryKiller概述

Agenda Low memory killer 概述 内核空间LMK ULMK‐vmpressure ULMK‐PSI Low memory killer 概述 lowmemorykiller的作用就是当内存比较紧张的时候去及时杀掉一些对用户来说不那么重要的进程&#xff0c;回收内存&#xff0c;保证手机的正常运行。安卓平台lowmemorykiller机…...

特殊操作流——案例:游戏次数

需求&#xff1a;请求程序实现猜数字小游戏只能试玩三次&#xff0c;如果还想玩&#xff0c;提示&#xff1a;游戏已经结束&#xff0c;想玩请充值&#xff08;www.itcast.cn&#xff09; 思路&#xff1a; 写一个游戏类&#xff0c;里面有一个猜数字的小游戏 写一个测试类&am…...

git clone connect to gitlab sign in token弹窗让我输入用户名和密码

系列文章目录 文章目录系列文章目录前言前言 当我使用git bash输入命令&#xff1a;git clone https://gitlab.freedesktop.org/raqm/raqm.git libraqm 弹窗 ASUSLAPTOP-0R30I78P MINGW64 /e/krita-dev $ git clone https://gitlab.freedesktop.org/raqm/raqm.git libraqm C…...

【Blender】如何在Blender中添加HDRI环境贴图

​ 什么是HDRI环境贴图 环境贴图或HDRI贴图是在Blender中照亮3D场景并实现逼真效果的最有效和最快捷的方法之一。 HDRIs本质上是现实世界照明的快照&#xff0c;其中包含高动态范围成像&#xff08;HDRI&#xff09;的准确照明细节。HDRI是一个包含亮度信息&#xff08;从暗…...

前端监控指的是什么?

前端监控分为三个方面&#xff1a; 异常监控&#xff08;监控前端页面的报错&#xff09;性能监控&#xff08;监控页面的性能&#xff09;用户行为监控&#xff08;监控用户的行为&#xff0c;计算PV、UV、在线时间等、数据监控即我们常说的埋点 例子1 在后端突然上线了某个需…...

.net core 面试题 2023

文章目录1. 什么是 ASP.net core2. .net 术语3. 托管资源 和 非托管资源4. GC 和 垃圾回收5. .net中所有类的基类6. 如何实现对象的深拷贝7. 依赖注入&#xff0c;为什么使用依赖注入8. IOC容器的注入方法9. ASP.net core 中 服务生命周期10. scoped的 service 可以注入到 sing…...

和ChatGPT关于Swing music的一场对话(上篇)

什么是 Swing Music &#xff1f; Swing Music 是一款漂亮的自托管音乐播放器&#xff0c;适用于您的本地音频文件。就像一个更酷的 Spotify …但带上你自己的音乐。 第一次在 reddit 上看到 Swing Music&#xff0c;就被其 UI 吸引了 但源码站点的releases 中只有 windows 和 …...

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…...

debian 10 扩展分区容量

debian 10 扩展分区容量1、扩展分区原因2、添加一块磁盘3、命令记录3.1、新增加的磁盘是/dev/sdb3.2、使用磁盘/dev/sdb 创建物理卷3.3、 把物理卷/dev/sdb加入到卷组debian-vg中3.4、查看物理卷、逻辑卷3.5、扩展逻辑卷/tmp3.6、逻辑卷组debian-vg 空余空间被用掉10g 还剩90g可…...

【无功优化】基于改进遗传算法的电力系统无功优化研究【IEEE30节点】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

LeetCode 218. 天际线问题

城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示&#xff0c;其中三元组 buildings[i] [lefti, righti, heighti] 表示&#xf…...

Logstash:使用自定义正则表达式模式

有时 Logstash Grok 没有我们需要的模式。 幸运的是我们有正则表达式库&#xff1a;Oniguruma。在很多时候&#xff0c;如果 Logstash 所提供的正则表达不能满足我们的需求&#xff0c;我们选用定制自己的表达式。 定义 Logstash 是一种服务器端数据处理管道&#xff0c;可同时…...