【 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 如何在程序开发中途去添加一个框架依赖?
- 五、⽇志持久化
- 六、总结
一、⽇志的作用
⽇志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是排除和定位问题
除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:
- 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户
- 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈
- 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持
以上这些都是⽇志提供的⾮常实⽤的功能
⽇志真实使⽤案例:
关键节点上的关键数据⽇志记录举例:例如教务系统,在注册时不⽌要在教务系统添加⼀条⽤户记录,同时也会给论坛添加⼀条⼀模⼀样的⽤户记录,这样做的⽬的是为了实现⼀次注册,多处使⽤的⽬的。不需要⽤户在两边系统注册了,等于在程序中以极低的成本实现的⽤户数据的同步,但这样设计有⼀个致命的问题,⽤户在教务系统注册信息的时候,如果论坛挂了,那么⽤户的注册⾏为就会失败?因为⽤户在注册的时候需要同步注册到论坛系统,但论坛现在挂了,这个时候怎么办呢?最简单的解决⽅案,教务系统在注册的时候,不管论坛是否注册成功,都给⽤户返回成功,那这个时候如果论坛注册失败了怎么办?⾮常简单,如果注册失败了,记录⼀下⽇志,等论坛恢复正常之后,把⽇志给论坛的管理⼈员,让他⼿动将注册失败的⽤户同步到论坛系统,这样就最低成本的解决了问题。这就是⽇志的重要作⽤
二、认识⽇志
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:

通过上述⽇志信息我们能发现以下 3 个问题:
- Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。
- 默认情况,输出的⽇志并⾮开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
- ⽇志默认打印在控制台上,⽽控制台的⽇志是不能被保存的,那怎么把⽇志永久保存下来呢?
下⾯我们⼀起来找寻这些问题的答案
三、⾃定义⽇志打印
开发者⾃定义打印⽇志的实现步骤:
- 在程序中得到⽇志对象
- 使⽤⽇志对象的相关语法输出要打印的内容
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 ⽇志级别的分类
⽇志的级别分为:
- trace:微量,少许的意思,级别最低;
- info:普通的打印信息;
- debug:需要调试时候的关键信息打印;
- warn:警告,不影响使⽤,但需要注意的问题;
- error:错误信息,级别较⾼的错误⽇志信息;
- 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 来更简单的输出
- 添加 lombok 框架⽀持
可以在创建 springb 项目时,勾选 lombok 框架,也可以手动注入该依赖

4.2.2.3.1 如何在程序开发中途去添加一个框架依赖?
- 添加插件 Edit Starters
- 在 pom.xml 中右击鼠标点击 Generate

- 使⽤ @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 就会将控制台的⽇志写到相应的⽬录或⽂件下了
- 设置日志文件保存的路径
logging.file.path=F:/JavaTestDemo/loggingTestDemo
运行 UserController 类效果如下:

打开该文件夹观察:

由此可见我们打印的日志成功保存在我们设置的文件目录下!!
- 设置日志文件的文件名
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,当前升级过后高德地图使用也需要加上安全秘钥 注册账号 访问高德地图开发平台根据实际情况填写就可以🍜(实名认证的时候选择个人就可以,如果是企业级的项目,可能会涉及人员变动…...
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之嵌入式操作系统
也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…...
git 实际开发中使用-解决问题
前言 git代码版本管理工具,打破常规的物理传输,更新,合并,回滚提高了开发效率和可追溯性。 网上的资料会把所有的命令都很全也很多,导致对刚刚了解的同学不友好,很难实际使用。 每个人都有自己使用git的习…...
新星计划·2023-第1期 - Python赛道报名入口 -〖你就是下一个新星〗
↓↓↓报名方式:(下滑到本页面底部)重要提醒:这里是 新星计划2023-第1期 - Python赛道报名入口,一经报名,不可更换。报名入口点击此处跳转 一、新星计划 新星计划是一个以发掘潜力新人、培养优质博主为目…...
Android LowMemoryKiller概述
Agenda Low memory killer 概述 内核空间LMK ULMK‐vmpressure ULMK‐PSI Low memory killer 概述 lowmemorykiller的作用就是当内存比较紧张的时候去及时杀掉一些对用户来说不那么重要的进程,回收内存,保证手机的正常运行。安卓平台lowmemorykiller机…...
特殊操作流——案例:游戏次数
需求:请求程序实现猜数字小游戏只能试玩三次,如果还想玩,提示:游戏已经结束,想玩请充值(www.itcast.cn) 思路: 写一个游戏类,里面有一个猜数字的小游戏 写一个测试类&am…...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
Reasoning over Uncertain Text by Generative Large Language Models
https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
智能体革命:企业如何构建自主决策的AI代理?
OpenAI智能代理构建实用指南详解 随着大型语言模型(LLM)在推理、多模态理解和工具调用能力上的进步,智能代理(Agents)成为自动化领域的新突破。与传统软件仅帮助用户自动化流程不同,智能代理能够自主执行工…...
Python爬虫(四):PyQuery 框架
PyQuery 框架详解与对比 BeautifulSoup 第一部分:PyQuery 框架介绍 1. PyQuery 是什么? PyQuery 是一个 Python 的 HTML/XML 解析库,它采用了 jQuery 的语法风格,让开发者能够用类似前端 jQuery 的方式处理文档解析。它的核心特…...
华为云Flexus+DeepSeek征文 | MaaS平台避坑指南:DeepSeek商用服务开通与成本控制
作者简介 我是摘星,一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型,将实际使用经验分享给大家,希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 前言 一、技术架构概览 1.1 整体架构设…...
