【 SpringBoot ⽇志⽂件 】

news2024/10/6 17:27:06

文章目录

  • 一、⽇志的作用
  • 二、认识⽇志
  • 三、⾃定义⽇志打印
    • 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 个级别。⽇志级别依次提升,⽽⽇志界别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志永久地保存下来

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

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

相关文章

【通过Cpython3.9源码看看python的内存回收机制】

一:建立对象引用计数 1. 相关代码 void _Py_NewReference(PyObject *op) {if (_Py_tracemalloc_config.tracing) {_PyTraceMalloc_NewReference(op);} #ifdef Py_REF_DEBUG_Py_RefTotal; #endifPy_SET_REFCNT(op, 1); #ifdef Py_TRACE_REFS_Py_AddToAllObjects(op…

【算法】AB3DMOT之Sutherland Hodgman多边形裁剪

在AB3MOT模型中有一个步骤为计算IOU时,需要先计算两个立体在地面的投影2D形状,然后计算两个投影的重叠部分,实际上为多边形的裁剪算法。 AB3MOT classmethod def box2corners3d_camcoord(cls, bbox):Takes an objects 3D box with the repr…

懒人式迁移服务器深度学习环境(完全不需要重新下载)

换服务器了?想迁移原来服务器上的深度学习环境,但又觉得麻烦懒得重新安装一遍anaconda、pytorch?有没有办法能不费吹灰之力直接迁移?接下来跟着我一起,懒汉式迁移。   本方法适用于在同一内网下的两台服务器之间互相…

【深度强化学习】(8) iPPO 模型解析,附Pytorch完整代码

大家好,今天和各位分享一下多智能体深度强化学习算法 ippo,并基于 gym 环境完成一个小案例。完整代码可以从我的 GitHub 中获得:https://github.com/LiSir-HIT/Reinforcement-Learning/tree/main/Model 1. 算法原理 多智能体的情形相比于单智…

SpringCloud GateWay与Nacos使用

网关就相当于一个内网与外网的出入口,起着 安全、验证的功能,如果没有网关,那么如果需要实现验证的功能,除非 SpringCloud GateWay 作为微服务的网关,起着如下作用 ① 作为所有API接口服务请求的接入点 ② 作为所有后端业务服务…

SpringBoot 整合 RabbitMQ (四十一)

二八佳人体似酥,腰间仗剑斩愚夫。虽然不见人头落,暗里教君骨髓枯。 上一章简单介绍了SpringBoot 实现 Web 版本控制 (四十),如果没有看过,请观看上一章 关于消息中间件 RabbitMQ, 可以看老蝴蝶之前的文章: https://blog.csdn.net/yjltx1234csdn/categor…

还不懂如何与AI高效交流?保姆级且全面的chatGPT提示词工程教程来啦!(一)基础篇

还不懂如何与chatGPT高效交流?保姆级且全面的chatGPT提示词工程教程来啦!(一)基础篇 文章目录还不懂如何与chatGPT高效交流?保姆级且全面的chatGPT提示词工程教程来啦!(一)基础篇一&…

CDH6.3.2大数据集群生产环境安装(七)之PHOENIX组件安装

添加phoenix组件 27.1. 准备安装资源包 27.2. 拷贝资源包到相应位置 拷贝PHOENIX-1.0.jar到/opt/cloudera/csd/ 拷贝PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel.sha、PHOENIX-5.0.0-cdh6.2.0.p0.1308267-el7.parcel到/opt/cloudera/parcel-repo 27.3. 进入cm页面进行分发、…

【AIGC】9、BLIP-2 | 使用 Q-Former 连接冻结的图像和语言模型 实现高效图文预训练

文章目录一、背景二、方法2.1 模型结构2.2 从 frozen image encoder 中自主学习 Vision-Language Representation2.3 使用 Frozen LLM 来自主学习 Vision-to-Language 生成2.4 Model pre-training三、效果四、局限性论文:BLIP-2: Bootstrapping Language-Image Pre-…

unity 序列化那些事,支持Dictionary序列化

目录 一、普通类型和UnityEngine空间类型序列化 二、数组、list的序列化 三、自定义类的序列化支持 四、自定义asset 五、在inspector面板中支持Dictionary序列化 1、在MonoBehaviour中实现Dictionary序列化 2、自定义property,让其在inpsector能够显示 3、Mo…

【从零开始学Skynet】实战篇《球球大作战》(七):gateway代码设计(下)

1、确认登录接口 在完成了登录流程后,login会通知gateway(第⑧阶段),让它把客户端连接和新agent(第⑨阶段)关联起来。 sure_agent代码如下所示: s.resp.sure_agent function(source, fd, play…

[Gitops--1]GitOps环境准备

GitOps环境准备 1. 主机规划 序号主机名主机ip主机功能软件1dev192.168.31.1开发者 项目代码 apidemogit,golang,goland2gitlab192.168.31.14代码仓库,CI操作git-lab,git,golang,docker,gitlab-runner3harbor192.168.31.104管理和存储镜像docker,docker-compose,harbor4k8s-m…

基础排序算法【计数排序】非比较排序

基础排序算法【计数排序】非比较排序⏰【计数排序】🕐计数🕦排序🕓测试⏰总结:⏰【计数排序】 计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用 > 基本思路: 1.统计数据出现的次数 2.根据统计的结…

并行分布式计算 并行算法与并行计算模型

文章目录并行分布式计算 并行算法与并行计算模型基础知识定义与描述复杂性度量同步和通讯并行计算模型PRAM 模型异步 PRAM 模型 (APRAM)BSP 模型LogP 模型层次存储模型分层并行计算模型并行分布式计算 并行算法与并行计算模型 基础知识 定义与描述 并…

15个最适合初创公司创始人使用的生产力工具

创业是一段激动人心且收获颇丰的旅程,同时也伴随着一些挑战。创始人往往要面对长时间的工作、紧迫的期限和大量的压力时刻。因此,初创公司创始人必须最大限度地利用他们的时间并利用他们可用的生产力工具——不仅是为了发展他们的业务,而且是…

Cron表达式简单介绍 + Springboot定时任务的应用

前言 表达式是一个字符串,主要分成6或7个域,但至少需要6个域组成,且每个域之间以空格符隔开。 以7个域组成的,从右往左是【年 星期 月份 日期 小时 分钟 秒钟】 秒 分 时 日 月 星期 年 以6个域组成的,从右往左是【星…

【精华】表格识别技术-MI

表格识别是指将图片中的表格结构和文字信息识别成计算机可以理解的数据格式,在办公、商务、教育等场景中有着广泛的实用价值,也一直是文档分析研究中的热点问题。围绕这个问题,我们研发了一套表格识别算法,该算法高效准确地提取图…

RabbitMq 的消息可靠性问题(二)---MQ的消息丢失和consumer消费问题

前言 RabbitMq 消息可靠性问题(一) — publisher发送时丢失 前面我们从publisher的方向出发解决了发送时丢失的问题,那么我们在发送消息到exchange, 再由exchange转存到queue的过程中。如果MQ宕机了,那么我们的消息是如何确保可靠性的呢?当消…

SQL的函数

文章目录一、SQL MIN() Function二、SQL SUM() 函数三、SQL GROUP BY 语句四、SQL HAVING 子句五、SQL EXISTS 运算符六、SQL UCASE() 函数总结一、SQL MIN() Function MIN() 函数返回指定列的最小值。 SQL MIN() 语法 SELECT MIN(column_name) FROM table_name;演示数据库 …

Numba witch makes Python code fast

一. 前言:numba,让python速度提升百倍 python由于它动态解释性语言的特性,跑起代码来相比java、c要慢很多,尤其在做科学计算的时候,十亿百亿级别的运算,让python的这种劣势更加凸显。 办法永远比困难多&a…