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

Spring Boot日志:从Logger到@Slf4j的探秘

写在前面

Hello大家好,今日是2024年的第一天,祝大家元旦快乐?? 2024第一篇文章从SpringBoot日志开始

在这里插入图片描述

在这里插入图片描述

文章目录
  • 一、前言
  • 二、日志有什么用?
  • 三、日志怎么用?
  • 四、自定义日志打印
    • ?? 常见日志框架说明
    • 4.1 在程序中得到?志对象【Logger】
    • 4.2 使??志对象打印?志
    • 4.3 ?志格式解读
  • 五、日志级别
    • 5.1 日志级别的作用
    • 5.3 日志级别分类和使用
  • 六、日志持久化【将日志保存下来】
    • 6.1 设置日志的保存路径
    • 6.2 配置?志?件的?件名
  • 七、更简单的?志输出 — lombok
    • 7.1 添加 lombok 依赖
    • 7.2 使用 @slf4j 输出日志
    • 7.3 lombok 原理解释
    • 7.4 lombok 更多注解说明
  • 八、总结与提炼

一、前言

在我们日常的公司开发中,难免都会存在着大大小小的BUG,不可能会有公司说我们的项目做出来是没有BUG的,那既然或多或少会BUG的话,要如何去发现BUG呢?

  • 那对于我们程序员来说,首先会想到的就是DeBug调试,有关IDEA的一些调试技巧,读者可以看看和这个视频 链接
  • 但是除了调试之外,其实我们还有其他的方法,既然我们在学习SpringBoot的话,那就要知道它里面其实有个东西叫做 日志文件,对于【日志】来说相信对大部分的开发者来说也是不陌生的,因为我们日常的开发中如果遇到一些问题的话,其实第一时间就会去查找日志,因为有些错误仅仅通过调试是排查不出来的,甚至是专业的排查工具也做不到,但是【日志】却记录了很多程序运行过程中的种种细节

?? 接下去就让我们来看看日志到底是个什么东西?

二、日志有什么用?

  1. 记录错误日志和警告日志(发现和定位问题):

    • 在交了钱之后却没有这位同学的记录了,后期只能靠错误日志去排查
  2. 记录用户的登录日志:

    • 通过记录同学们的登录时间,教务系统更新的时间
    • 如果发现有恶意的用户,就将其IP加入到黑名单中
  3. 记录系统的操作日志:

    • 比方说在教务系统不小心将一个同学的班级转错了,那就需要操作日志来进行数据恢复
    • 还可以通过这个操作日志才定位到操作人,是谁误操作了,防止推卸责任
  4. 程序执行日志:

三、日志怎么用?

Spring Boot 项在启动的时候默认就有志输出,如下图所示:

在这里插入图片描述

?? 那有同学就会说,既然都有日志了,为什么还要再去学习呢?

此时我便提出了以下几个问题

  1. 既然SpringBoot已经内置了日志,那就要去明白它内置的日志究竟是什么?
  2. 默认情况下,输出的志并是开发者定义和打印的,那开发者怎么在程序中定义打印志呢?
  3. 志默认是打印在控制台上的,控制台的志是不能被保存的,那么怎么把志永久的保存下来呢?
  4. 既然它已经内置了日志框架了,那这个框架应该怎么用?

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

四、自定义日志打印

有的同学认为我们日常在写代码时使用 System.out.println()输出的内容就是日志,那我们可以用这个方法来打印看看

@RequestMapping("/sayhi")
public String sayHi(){System.out.println("打印日志");return "hello world ->" + myconfig;
}
  • 可以看到,只是在这个方法调用之后打印了对应的语句,但是这却不是我们想要看到的相关程序信息

在这里插入图片描述

?? 那么接下来我来介绍如何通过得到日志对象来打印日志

?? 常见日志框架说明

在这之前呢,我们要先来聊聊前面所提到的【日志框架】,首先你要知道的一点是:SpringBoot是内置了日志框架的

  • 我们可以来讲讲用户获取日志的调用流程:
    1. 用户在去写日志的时候不是直接具体去操作某个框架的,而是会先来到一个 日志门面 叫做Slf4j
    2. 然后Slf4j再根据系统的配置决定要调用的具体框架是什么

??这个Slf4j呢就类似于 房产中介??,我们在买房的时候不可能一家家地去找,而是通过房产中介来进行对接以此可以看到不同的户型

在这里插入图片描述

  • 我们在最早的时候使用这个log4j 1 是比较多的,后面就慢慢升级成log4j 2

注意:在去年log4j 被报出了漏洞,而且漏洞很严重,它可以通过这个漏洞直接把你的应用服务给关掉。那这个其实对许多公司来说是很大的一个问题,这里的话就不细讲了,有兴趣的同学可以去了解一下 链接

  • 所以到后面我们都换成了logback这个日志框架了,它就有人维护比较稳定一些,不过它的写法就不太一样了,类名、方法名都不一样了,所以我们直接去对接这个框架的话成本是非常高的,但如果此时我们有了Slf4j这个门面就不一样了??
  • 就和我们之前在讲解 JDBC连接数据库 的时候一样,为什么要有JDBC呢?就是因为不同的数据库有不同的驱动,如果当一个项目突然要换数据库的话(MySQL —> Oracle),就会很麻烦了。所以我们才有了JDBC这个东西,程序员直接去操作JDBC就可以了,它就是一套规范,就是一个【门面】,程序员们通过JDBC去适配不同的数据库,就可以做到很好地解耦

?? 我们也可以去验证一下SpringBoot是否真的内置了这两个框架,那可以观察到确实是有的

在这里插入图片描述

4.1 在程序中得到志对象【Logger】

在大致了解了SpringBoot中内置的框架后,我们就可以去试试看要如何获取到当前程序的日志

不过对于个日志对象的定义可以非常有讲究的

  1. 首先要明白我们这个日志对象是:
    • 方法级别(只能在某一个方法中去使用)
    • 类级别(可以在整个类的任何地方都能使用)

?? 那可以很清楚地知道,我们和这个日志对象一定是类级别的,因为要在整个类的任何方法都能获取到

  1. 那还要看的是这个日志对象是共有的还是私有的,那可以很明确,每个类都有自己的日志对象,所以它肯定是私有的,所以要用private来进行修饰
  2. 并且这个还得是 静态的,让其可以在方法中直接调用,那么就要用static来进行修饰
  3. 还有一点:你期望这个日志对象在某个方法中被修改吗?当然不想!所以我们还要再加上final关键字作为修饰

那么再加上一步步的修饰后,我们就要通过Slf4j所提供的接口去新建出一个日志对象了,注意在这里我们要选择org.slf4j这个包下的,不要导错包!

在这里插入图片描述

  • 那我们知道,对于一个接口来说是我们在获取志对象还需要使志 LoggerFactory,然后使用到里面的getLogger这个方法,这里一共有两种重写方法,我们先选择Class<?> clazz
    在这里插入图片描述

以下是它的源码,我们后面通过查看打印出来日志的形式来进行观察:

public static Logger getLogger(Class<?> clazz) {Logger logger = getLogger(clazz.getName());if (DETECT_LOGGER_NAME_MISMATCH) {Class<?> autoComputedCallingClass = Util.getCallingClass();if (autoComputedCallingClass != null && nonMatchingClasses(clazz, autoComputedCallingClass)) {Util.report(String.format("Detected logger name mismatch. Given name: "%s"; computed name: "%s".", logger.getName(), autoComputedCallingClass.getName()));Util.report("See https://www.slf4j.org/codes.html#loggerNameMismatch for an explanation");}}return logger;
}

4.2 使志对象打印志

  • 接下去我们就将这个日志对象给打印出来吧

    // 打印日志
    logger.trace(“test2 trace”);
    logger.debug(“test2 debug”);
    logger.info(“test2 info”);
    logger.warn(“test2 warn”);
    logger.error(“test2 error”);

  • 通过运行并访问路由,我们可以发现当前程序的日志信息被打印出来了,但是呢却不是从trace开始打印的,而是从info开始打印的,这个的话就要追溯到 日志等级的优先级默认级别 了,这个我们在下一模块会展开详细讲解

在这里插入图片描述

4.3 志格式解读

看到了打印出来的日志信息后,相信有很多读者并不是很了解每一条日志信息到底想告诉我们什么,现在就让我们来分析一下这些日志信息吧

在这里插入图片描述

  • 这里我们主要来关注两块地方:

    1. 第一个是这边的包名,你是否觉得c.e.controller这个名称有点熟悉呢?没错,它就是我们在这个包下创建类的时候自动导入的包名,前面两个ce即为缩写

      package com.example.demo.controller;

    2. 第二块的话就是后面的类名Test2Controller了,这个的话就要去回忆我们上面为 工厂类LoggerFactory 中的getLogger这个方法所传入的当前类类名,所以SpringBoot靠着这些很好地识别到并打印出了相应的日志信息


还记得我们在上面所谈到的getLogger这个方法的第二种形式吗,我们一起再来看看

  • 此时我们再创建一个类,然后采取不同的getLogger方法

在这里插入图片描述

  • 以下是具体的测试代码

    @RestController // = @Controller + @ResponseBody
    public class StudentController {
    private static final Logger logger = LoggerFactory.getLogger(“StudentController”);

    @RequestMapping("/stu/sayhi")
    public String sayhi(){logger.info("student info");logger.error("student error");return "student sayhi";
    }
    

    }

  • 然后我们来观察一下结果并与之前的方法进行一个对比就可以发现所打印出来的日志信息有着很大的不同,对于传入name来说所并不会展现出完整的包名路径,而是只有一个类名,所以想看到怎么样的日志信息读者可以自己来进行控制

在这里插入图片描述
以下是它的源码,供阅读参考

public static Logger getLogger(String name) {ILoggerFactory iLoggerFactory = getILoggerFactory();return iLoggerFactory.getLogger(name);
}

五、日志级别

整体地介绍完日志消息后,我们再来详细地介绍一下其中的一个东西叫做【日志级别】

5.1 日志级别的作用

  • 志级别可以帮你筛选出重要的信息,如设置志级别为 error,那么就可以只看程序的报错志了,对于普通的调试志和业务志就可以忽略了,从节省开发者信息筛选的时间。
  • 志级别可以控制不同环境下,个程序是否需要打印志,如【开发环境】我们需要很详细的信息,【产环境】为了保证性能和安全性就会输尽量少的志,通过志的级别就可以实现此需求。

5.3 日志级别分类和使用

  • trace:微量,少许的意思,级别最低;

  • debug:需要调试时候的关键信息打印;

  • info:普通的打印信息(默认志级别);

  • warn:警告,不影响使,但需要注意的问题;

  • error:错误信息,级别较的错误志信息;

  • fatal:致命的,因为代码异常导致程序退出执的事件。

志级别的顺序:

在这里插入图片描述

?? 级别越高所能接收到的消息就越少了,比如说error只能接收到errorfatal级别的日志

清楚各个日志级别后,我们就来配置文件中实际地来操作一下吧??

  • 志级别配置只需要在配置件中设置“logging.level”配置项即可,如下所示:

    日志级别设置

    logging:
    level:
    root: error

  • 然后我们通过去访问不同的路由地址就可以看到,即使我们选择打印不同的日志级别,但是打印出来的内容只有error

在这里插入图片描述

  • 我们还可以做进一步更加严格的设置,只打印我们当前项目中controller层中的所触发的日志信息

    日志级别设置

    logging:
    level:
    root: error
    com:
    example:
    demo:
    controller: trace

先把项目重启一下我们可以看到,任何多余的日志都没有看到,就等待我们去访问
在这里插入图片描述
接着去访问一下就可以看到打印出来了相关的日志信息,而且很干净,并没有任何杂志

在这里插入图片描述
?? 所以在学习了日志级别后我们就可以清除掉配置件中的原先志设置,从而随心地去控制日志的打印内容

六、日志持久化【将日志保存下来】

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

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

6.1 设置日志的保存路径

  • 首先我们来看看如何设置日志的保存路径,这里在对于路径的设置要注意以下两点:

    1. 尽量不要将保存的路径写在系统盘
    2. 路径中不要出现中文和空格
  • 比方说我现在将日志文件的输出路径放到了D盘下的home文件夹下

    日志保存路径

    logging:
    file:
    path: D:\home

  • 然后我们将项目重启并访问相关路由就可以看到,名为spring.log的文件就出现了,点进去一看确实出现了我们上面在控制台中所出现的日志信息

在这里插入图片描述

我们来看看几位同学的问题(((*)

?? 那有同学就说,那在项目重启之后会不会丢失呢?

  • 答案是:不会的。日志文件一旦产生,那么日志文件及其内容就会永久得保存,不会出现文件或内容的丢失,无论任何操作都会保持以上的特性

?? 那在重启项目后再去运行,存储的日志会不会将之前的日志覆盖掉呢?

  • 答案是:不会的。对于日志的记录是一个append追加的过程,而不会产生一个覆盖的现象

我们可以将项目重启后再来访问一下看看,便可以观察到上一次的日志信息确实还存留,并且追加上了这一次的日志信息??
在这里插入图片描述
?? 如果一直像上面那样追加,如果文件变得越来越大怎么办呢?

  • 这个不需要担心,有最大文件大小限制,如果超过了的话就会重新去创建一个,可以看 Spring的官方文档

在这里插入图片描述

6.2 配置志件的件名

那么除了可以设置日志的保存路径外呢,我们还可以去配置志件的件名,可以不用系统默认的,自己也可以起名哦~

  • 比方说我在这里将名字取为springboot.log,不过要记得取名字的同时也要带上路径哦,否则就就无法输出到指定的路径了,就会直接保存在当前项目中

    日志保存名称

    logging:
    file:
    name: D:\home\springboot.log

来运行一下看看,确实可以看到出现了一个名为springboot.log的文件

在这里插入图片描述
?? 那这个时候又有同学问了:什么东西都存在文件里,万一系统被入侵了文件不是很容易丢失吗?

  • 这个问题问得很好?? 在公司中做大项目的时候,我们并不是所有的日志信息都放在文件中,对于有些文件我们则是选择存放在【数据库】 中

对于生产级别日志分类 —— 根据业务场景来定

  1. 程序运行日志(存放在文件中)
    • 属于边缘性的东西,简单看一下
  2. 业务日志(存放到数据库中)
    • 记录系统关键操作的关键人,以及其修改前后的操作

?? 【综合练习】:将 controller 包下 error 级别以上的志保存到 log_all.log 下,将 service 下warn 级别以上的志保存到 log_all.log 下

七、更简单的志输出 — lombok

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

7.1 添加 lombok 依赖

  • 首先我们要在IDEA中去安装一个插件,叫做EditStarters

在这里插入图片描述

  • 接下去就要在pom.xml依赖文件中通过这个插件去生成相关的lombok依赖
    在这里插入图片描述

然后在文件中就会多出来以下依赖了

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>

7.2 使用 @slf4j 输出日志

  • 有了依赖的支持,接下去我们就可以通过 @slf4j 这个注解去代替前面繁琐的日志对象创建过程了,这个注解会给当前的类提供一个log对象,使用这个对象就可以去调用对应日志级别了

在这里插入图片描述

@RequestMapping("/log/sayhi")
public String sayhi(){log.info("info log");log.warn("warn log");log.error("error log");return "log sayhi";
}

然后我们来运行一下试试,便可以观察到与前面获取到的日志信息是一样的~

在这里插入图片描述

7.3 lombok 原理解释

但是光这样子是不够的,我们要做到的是 知其然,知其所以然。对于lombok 来说,它呢是编译期间的一个框架

  • 通过我们之前的学习可以知道,对于一个普通的Java程序来说,当用户写好代码之后进行编译,然后生成一个.class为后缀的字节码文件,将其放到JVM虚拟机上去运行就可以让程序跑起来了

在这里插入图片描述

  • 但是对于lombok框架支持后,它就会与普通的java程序一同进行编译,然后生成.class为后缀的字节码文件

在这里插入图片描述

那怎么去证实呢?我们一起来看看

  • 首先我们在启动项目后到target文件中去进行查看,然后打开内部的controller文件

在这里插入图片描述

  • 在其内部我们看到了编译好的.class为后缀的字节码文件,将其拖入到IDEA中观察一下??

在这里插入图片描述

  • 将编译前后的文件进行对比我们可以发现,因为@Slf4j注解的缘故,出现了我们在前面所学习的Logger接口所新建出来的对象,不过这里叫做log
  • 那其实我们就看得很明确了,其实 lombok 的这个注解所做的工作其实就是在做生成日志对象的转换工作,这就是为何说 Spring面向注解开发 的原因了

在这里插入图片描述

7.4 lombok 更多注解说明

当然,lombok 这个框架可不知那么一个注解,它的功能还是很强大的,其中的很多注解都可以帮助我们快速地去进行开发

  1. 基本注解:

注解

作用

@Getter

动添加 getter 法

@Setter

动添加 setter 法

@ToString

动添加 toString法

@EqualsAndHashCode

动添加 equals 和 hashCode 法

@NoArgsConstructor

动添加参构造法

@AllArgsConstructor

动添加全属性构造法,顺序按照属性的定义顺序

@NonNull

属性不能为 null

@RequiredArgsConstructor

动添加必需属性的构造法,final + @NonNull 的属性为必需

  1. 组合注解:

注解

作用

@Data

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

  1. 志注解

注解

作用

@Slf4j

添加个名为 log 的志,使 slf4j

八、总结与提炼

接下去来总结一下本文所学习的内容??

  1. 首先我们简单地来聊了聊日志是什么:志是程序中的重要组成部分,使志可以快速的发现和定位问题,SpringBoot 内容了志框架:SLF4Jlogback 是我们最常用的两个,其二者通过 SLF4J 这个日志门面可以实现很好的解耦,方便后期的替换维护,与我们之前所讲的 JDBC 有着异曲同工之妙
  2. 然后我们又讲到了如何去获取日志对象:在这一块首先我们讲到了使用一个 工厂类LoggerFactory 去实现Logger接口,然后通过调用其中的方法并传入对应的参数来获取到对应的日志对象,接着再通过这个对象去调用【日志级别】来进行输出
  3. 然后我们便详细地说到了【日志级别】:其包含 6 个级别:
    • trace:微量,少许的意思,级别最低;
    • debug:需要调试时候的关键信息打印;
    • info:普通的打印信息(默认志级别);
    • warn:警告,不影响使,但需要注意的问题;
    • error:错误信息,级别较的错误志信息;
    • fatal:致命的,因为代码异常导致程序退出执的事件。
  4. 然后呢我们又学了什么是日志持久化: 通过去设置 日志的保存路径 以及 志件的件名 便可以控制我们所观察到的日志信息
  5. 最后呢我们又学了一个很棒的框架: 它叫做 lombok,通过 lombok 提供的 @Slf4j 注解和 log 对象我们可以实现快速的打印定义志,当然我们还去好好地探究了一番这个注解究竟怎么一回事,做到了 “知其然,知其所以然”

以上就是本文要介绍的所有内容,诚挚感谢您对本文的观看???

在这里插入图片描述

相关文章:

Spring Boot日志:从Logger到@Slf4j的探秘

写在前面 Hello大家好&#xff0c;今日是2024年的第一天&#xff0c;祝大家元旦快乐?? 2024第一篇文章从SpringBoot日志开始 文章目录 一、前言二、日志有什么用&#xff1f;三、日志怎么用&#xff1f;四、自定义日志打印 ?? 常见日志框架说明4.1 在程序中得到?志对象【…...

使用 LabVIEW 与 PLC 通信的方式

要将 PLC 与 LabVIEW 或其他 NI 产品进行通信&#xff0c;首先需要明确 PLC 支持的通信协议和接口类型。NI 提供了多种方案&#xff0c;包括 OPC 服务器、Modbus、Ethernet/IP 和其他工业通信协议。下面将详细介绍这些方法&#xff0c;并进行比较分析&#xff0c;帮助你选择最适…...

python录制鼠标键盘操作循环播放

依赖 pip install pynput 程序: from pynput import mouse, keyboard import time import threading# 用于存储录制的鼠标和键盘事件 mouse_events [] keyboard_events []# 定义事件处理函数# 处理鼠标事件 def on_move(x, y):mouse_events.append((move, x, y))def on_cl…...

开发者如何使用GCC提升开发效率Opencv操作

看此篇前请先阅读 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144134160?spm=1001.2014.3001.5502 https://blog.csdn.net/qq_20330595/article/details/144216351?spm=1001…...

异常与文件

目录 1.异常 1.1.概念 1.2.常见异常 1.3.异常处理方式 1.3.1.try except 1.3.2.try except else 1.3.3.try except else finally 2.文件 2.1.文件分类 ps&#xff1a;python 程序的数据保存在哪里? 2.2.常见的文件类型 2.3.python 操作文件的函数 2.3.1.读取文件…...

【C语言】完成程序设计填空

文章目录 1、请阅读下面的程序,在空白处填写正确的代码,要求各在一行从头开始输出m和n的值。2、求100~599之间的所有水仙花数,即各位数字的立方和恰好等于该数本身的数。3、以下程序的功能是:将值为三位正整数的变量x中的数值按照个位、十位、百位的顺序 拆分并输出。请填空…...

西湖大学:LLM零样本推理任务校准

&#x1f4d6;标题&#xff1a;Task Calibration: Calibrating Large Language Models on Inference Tasks &#x1f310;来源&#xff1a;arXiv, 2410.18764 &#x1f31f;摘要 &#x1f538;大型语言模型&#xff08;LLM&#xff09;在推理任务上表现出令人印象深刻的零样本…...

windows下Qt5自动编译配置QtMqtt环境(11)

文章目录 [toc]1、概述2、准备1.1 下载源码1.2 配置环境1.3 解释原理 3、编译4、验证5、参考6、视频 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;Qt网络编程 &#x1f448; 1、概述 Qt默认是不包含mqtt库的&#xff0c;如果需要使用到mqtt库就只能自己编译配…...

每天五分钟深度学习:神经网络的前向传播的计算(多样本)

本文重点 前面我们学习了单样本的前向传播,本文我们学习多样本的前向传播,我们先来回忆一下,神经网络的单样本的前向传播的向量化的方式: m个样本依次进行前向传播 这里我们说明一下符号: 我们使用(m)表示第m个样本,用[m]表示神经网络的第m层 a[2](i) 表示第i个样本计…...

基于 NXP S32K312+FS23 的汽车通用评估板方案

S32K3 系列是 NXP 推出的面向汽车电子和工业应用的微控制器&#xff0c;基于 ARMCortex-M7 内核&#xff0c;支持单核、双核和锁步内核配置。S32K3 系列具有内核、内存和外设数量方面的可扩展性&#xff0c;符合 ISO26262 标准&#xff0c;能达到 ASIL B/D 安全等级&#xff0c…...

11进阶篇:专业课论文阅读方向指南(2025版)

文章目录 第一个检索式:图情档核心期刊(北大 + CSSCI)发文情况研究方法类关键词研究主题类关键词论文阅读建议第二个检索式:川大公共管理学院在核心期刊(北大 + CSSCI)的发文情况研究方法类关键词研究主题类关键词特点关键词与2024年972(现815)两道题目的映射情况815信…...

Qt之第三方库‌QXlsx使用(三)

Qt开发 系列文章 - QXlsx&#xff08;三&#xff09; 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.写入数据 2.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用程序功能的控件…...

第145场双周赛: 使数组的值全部为 K 的最少操作次数、破解锁的最少时间 Ⅰ、使两个整数相等的位数操作、统计最小公倍数图中的连通块数目

Q1、使数组的值全部为 K 的最少操作次数 1、题目描述 给你一个整数数组 nums 和一个整数 k 。 如果一个数组中所有 严格大于 h 的整数值都 相等 &#xff0c;那么我们称整数 h 是 合法的 。 比方说&#xff0c;如果 nums [10, 8, 10, 8] &#xff0c;那么 h 9 是一个 合法…...

AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报

一、XMLHttpRequest基本使用 XMLHttpRequest&#xff08;XHR&#xff09;对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…...

Android期末复习题

1.如何搭建Android开发环境&#xff1f; 答案:搭建Android开发环境需要以下几个步骤&#xff1a; &#xff08;1&#xff09;下载和安装JDK &#xff08;2&#xff09;配置PATH环境变量 &#xff08;3&#xff09;下载和安装Android Studio &#xff08;4&#xff09;创建A…...

《蓝桥杯比赛规划》

一、比赛简介 蓝桥杯全国软件和信息技术专业人才大赛是一项具有较高影响力的编程竞赛&#xff0c;旨在促进软件和信息技术领域专业技术人才的培养&#xff0c;提升高校毕业生的就业竞争力。比赛涵盖了多个编程语言和专业方向&#xff0c;包括 C/C、Java、Python 等。 二、目标…...

三、Zookeeper

Zookeeper 三、Zookeeper3.1什么是zookeeper?3.2为什么需要zookeeper3.3Zookeeper基本运行流程3.4Zookeeper数据模型3.5Zookeeper主要角色3.6Zookeeper工作原理3.7Zookeeper节点数据操作流程三、Zookeeper 3.1什么是zookeeper? ZooKeeper是一个分布式的,开放源码的分布式应…...

Wireshark数据抓包分析之传输层协议(TCP协议)

根据实验环境&#xff0c;本实验的步骤如下&#xff1a; 1.在测试环境使用发包工具和Wireshark抓取TCP三次握手和四次断开的数据包。 2.详细分析TCP协议的三次握手以及四次断开。 任务描述&#xff1a;安装发包工具&#xff0c;并配置TCP客户端&#xff0c;服务端&#xff0…...

用ai做机器视觉的事情

cnn&#xff08;卷积神经网络&#xff09;是典型的ai算法。 我们已经cnn实现像机器视觉中形状匹配的功能&#xff0c;因为使用了roi抠图匹配&#xff0c;所以就叫做roicnn&#xff0c;以区分整图匹配。下面是roicnn笔记总结&#xff1a; 20241022&#xff0c;roicnn搞定&…...

LLM - 开源视觉多模态 LLaVA-CoT(o1) 深度推理模型 测试与源码 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/144304351 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 LLaVA-…...

qtcanpool 知 10:包管理雏形

文章目录 前言痛点转机雏形实践后语 前言 曾听闻&#xff1a;C/Qt 没有包管理器&#xff0c;开发起来太不方便。这是一个有过 node.js 开发经验的人对 Qt 的吐槽。 确实&#xff0c;像 python、golang、node.js 这些编程语言都有包管理器&#xff0c;给用户带来了极佳的开发体…...

[保姆式教程]使用目标检测模型YOLO11 OBB进行旋转目标检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

之前写了一个基于YOLOv8做旋转目标检测&#xff08;OBB&#xff09;的文章&#xff0c;内容写得不够好&#xff0c;内容也有些杂乱无序。现如今YOLO已经更新到11了&#xff0c;数据集也集齐了无人机和卫星的农业大棚&#xff0c;所以这次就写一个基于YOLO11 OBB的农业大棚旋转检…...

MySQL 权限管理分配详解

MySQL 权限管理分配详解 MySQL权限系统的工作原理权限表的存取用户通过权限认证、进行权限分配的流程账号管理我们常用的授权all privileges到底有哪些权限呢&#xff1f;以及带来的安全隐患有哪些&#xff1f;创建账户的时候最好分配指定的权限&#xff0c;这样子安全也高管理…...

【期末速成】《微机原理与接口技术》知识点总结

文章目录 前言第一、二章 接口技术概述1. 接口的定义*2. 接口功能特点*3. 接口的分类*4. 接口中的传输信息及其组成5. 接口的编址与译码*6. CPU 与外设之间的数据传送方式* 第三章 总线1. 总线&#xff08;BUS&#xff09;的定义*2. 总线的标准3. 采用标准总线的优点*4. 总线的…...

华为、华三交换机纯Web下如何创关键VLANIF、操作STP参数

华为交换机WEB操作 使用的是真机S5735&#xff0c;目前主流的版本都适用&#xff08;V1R5~V2R1的就不在列了&#xff0c;版本太老了&#xff0c;界面完全不一样&#xff0c;这里调试线接的console口&#xff0c;电脑的网络接在ETH口&#xff09; 「模拟器、工具合集」复制整段内…...

【Elasticsearch】初始化默认字段及分词

1、添加分词插件 1&#xff09;在线安装 执行命令 需要指定相同的版本 bin/elasticsearch-plugin.bat install https://get.infini.cloud/elasticsearch/analysis-ik/7.17.24 2&#xff09;离线安装 将安装包解压到 /plugins 目录下 安装包可以从对应的资源处下载 启动成…...

asdf-java配置

asdf list all java 无结果 asdf list all java 显示结果 No compatible versions available 解决方案 参考 执行 cp ~/.asdf/plugins/java/data/jdk-macosx-x86_64-ga.tsv $TMPDIR/asdf-java-$(whoami).cache/releases-macosx-x86_64.tsv 在此执行 asdf list all java 就可…...

2-2-18-14 QNX系统架构之 TCP/IP 网络

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…...

RabbitMQ延迟消息的实现

RabbitMQ延迟队列的实现 延迟消息是什么延迟消息的实现死信交换机代码实现 延迟消息插件 延迟消息是什么 延迟消息是将消息发送到MQ中&#xff0c;消费者不会立即收到消息&#xff0c;而是过一段时间之后才会收到消息&#xff0c;进行处理。在一些业务中&#xff0c;可以用到延…...

Docker 安装 中文版 GitLab

Docker 安装系列 安装GitLab、解决服务器内存不足问题、使用域名/IP地址访问项目 1、拉取 [rootTseng ~]# docker pull twang2218/gitlab-ce-zh:latest latest: Pulling from twang2218/gitlab-ce-zh 8ee29e426c26: Pull complete 6e83b260b73b: Pull complete e26b65fd11…...

Ubuntu22.04深度学习环境安装【Anaconda+Pycharm】

anaconda可以提供多个独立的虚拟环境&#xff0c;方便我们学习深度学习&#xff08;比如复现论文&#xff09;&#xff1b; Pycharm编辑器可以高效的编写python代码&#xff0c;也是一个很不错的工具。 下面就记录下Ubuntu22.04的安装流程&#xff1a; 1.Anaconda安装 下载Ana…...

springboot整合canal

学习链接 Cannal项目地址 SpringBoot整合Canal实现数据同步到ElasticSearch - 原文地址 Spring Boot整合canal实现数据一致性解决方案解析-部署实战 Java&#xff1a;SpringBoot整合Canal实现数据同步 docker环境安装mysql、canal、elasticsearch&#xff0c;基于binlog利…...

8.在 Vue 3 中使用 OpenLayers 加载天地图示例(多种形式)

前言 OpenLayers 是一个强大的开源地图框架&#xff0c;可以轻松实现地图加载与操作。而 Vue 3 则通过 Composition API 提供了更加简洁和灵活的开发体验。本文将介绍如何在 Vue 3 中结合 OpenLayers 实现对天地图的加载&#xff0c;包括矢量地图、卫星地图以及中文和英文标记等…...

如何设置 Java 开发环境

如果你在这里&#xff0c;可能是想学习如何为 Java 开发设置环境。第一步是安装 SDK&#xff08;软件开发工具包&#xff09;&#xff0c;它是一组由硬件和软件供应商提供的工具和库。 对于 Java&#xff0c;我们使用 JDK&#xff08;Java 开发工具包&#xff09;。JDK 是一组…...

MetaGPT 安装

1. 创建环境 conda create -n metagpt python3.10 && conda activate metagpt2. 可编辑方式安装 git clone --depth 1 https://github.com/geekan/MetaGPT.git cd MetaGPT pip install -e .3. 配置 metagpt --init-config运行命令&#xff0c;在C盘位置C:\Users\325…...

石岩湿地公园的停车场收费情况

周末石岩湿地公园停车场【967个】小车停车费封顶14元价格还行&#xff0c;我还记得2020年的时候湿地公园还是10元一天封顶。现在的收费情况也是可以的&#xff0c;尤其是周末停车比工作日停车便宜还是很得民心的哈。 车型 收费标准 小车 工作日 高峰时间8:00~20:00 首小时…...

v3账号密码登录随机图片验证码

安装插件 pnpm i identify --save图形验证码组件 <template><div class"s-canvas"><!-- 图形验证码的宽和高都来自于父组件的传值&#xff0c;若父组件没有传值&#xff0c;那么就按当前子组件的默认值进行渲染 --><canvas id"s-canvas&…...

mysql8 主从复制一直失败

问题描述&#xff1a; 开启同步后从服务器一直失败&#xff0c;报错如下&#xff1a; Last_SQL_Error: Coordinator stopped because there were error(s) in the worker(s). The most recent failure being: Worker 1 failed executing transaction ANONYMOUS at source log …...

Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…...

【第二十四周】从大语言模型到多模态大模型的发展

摘要 大语言模型&#xff08;Large Language Model, LLM&#xff09;是指一类基于深度学习的人工智能系统&#xff0c;它们被设计用来理解和生成自然语言。这些模型通常是在大量的文本数据上进行训练的&#xff0c;通过学习文本中的模式和结构&#xff0c;它们能够执行各种各样…...

深入理解Java的 JIT(即时编译器)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

数据库技术文档撰写:全方位剖析

在技术的浩瀚海洋中&#xff0c;一份优秀的技术文档宛如精准的航海图。它是知识传承的载体&#xff0c;是团队协作的桥梁&#xff0c;更是产品成功的幕后英雄。然而&#xff0c;打造这样一份出色的技术文档并非易事。你是否在为如何清晰阐释复杂技术而苦恼&#xff1f;是否纠结…...

设计模式之原型模式:深入浅出讲解对象克隆

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” 原型模式概述 在我们的日常生活中&#xff0c;经常会遇到"复制"这样的场景。比如我们在准备文件时&#xff0c;常常会复印一份原件&a…...

centos 查看版本

在 CentOS 中&#xff0c;查看系统版本有多种方法。以下是几种常用的方法&#xff1a; 方法 1&#xff1a;使用 cat 命令查看 /etc/centos-release 文件 cat /etc/centos-release 这个文件包含了 CentOS 的版本信息。例如&#xff0c;输出可能是&#xff1a; CentOS Linux rel…...

如何本地存储中的文件路径

文章目录 1. 概念介绍2. 实现方法3. 示例代码我们在上一章回中介绍了"如何实现本地存储"相关的内容,本章回中将介绍如何实现文件存储.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在上一章回中介绍的本地存储只能存储dart语言中基本类型的数值,如果遇到…...

服务器加固

1.服务器密码复杂度 密码最小长度&#xff0c;密码复杂度策略 vim /etc/pam.d/system-auth --------------- #密码配置 #ucredit&#xff1a;大写字母个数&#xff1b;lcredit&#xff1a;小写字母个数&#xff1b;dcredit&#xff1a;数字个数&#xff1b;ocredit&#xff1a;…...

MongoDB change stream实战

什么是 Chang Stream Change Stream指数据的变化事件流&#xff0c;MongoDB从3.6版本开始提供订阅数据变更的功能。 Change Stream 是 MongoDB 用于实现变更追踪的解决方案&#xff0c;类似于关系数据库的触发器&#xff0c;但原理不完全相同&#xff1a; Change Stream 的实…...

TSWIKI知识库软件

TSWIKI 知识库软件介绍 推荐一个适合本地化部署、自托管的知识库软件 TSWIKI介绍 tswiki 是一个适合小团队、个人的知识库、资料管理的软件&#xff0c;所有数据均本地化存储。可以本地化、私有云部署&#xff0c;安装简单。在线预览。 主要功能说明 1、简化的软件依赖和安…...

【Linux课程学习】第十九弹---深入理解进程间通信---匿名管道,命名管道,多匿名管道的BUG

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux课程学习 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux学习笔记&#xff1a; https://blog.csdn.n…...

【C语言】库函数常见的陷阱与缺陷(1):字符串处理函数

目录 一、 strcpy 函数 1.1. 功能与常见用法 1.2. 陷阱与缺陷 1.3. 安全替代 1.4. 代码示例 二、strcat 函数 2.1. 功能与常见用法 2.2. 陷阱与缺陷 2.3. 安全替代 2.4. 代码示例 三、strcmp 函数 3.1. 功能与常见用法 3.2. 陷阱与缺陷 3.3. 安全替代 3.4. 代…...