当前位置: 首页 > 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…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

OD 算法题 B卷【正整数到Excel编号之间的转换】

文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的&#xff1a;a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...

LangFlow技术架构分析

&#x1f527; LangFlow 的可视化技术栈 前端节点编辑器 底层框架&#xff1a;基于 &#xff08;一个现代化的 React 节点绘图库&#xff09; 功能&#xff1a; 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...