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

Java日志记录几种实现方案

在平时使用到一些软件中,比如某宝或者某书,通过记录用户的行为来构建和分析用户的行为数据,同时也能更好优化产品设计和提升用户体验。比如在一个订单系统中,需要确定追踪用户的行为,比如:

  • 登录/登出
  • 浏览商品
  • 加购商品
  • 搜索商品关键字
  • 下单

上述行为就需要使用到日志系统来存储或者记录数据,Java 有几种日志方案,简单介绍几种实现方案,以及需要注意的点。

日志添加需要注意问题

根据业务的不同,需要使用匹配到合适的日志方案。也需要注意几个问题:

  • 不能影响原来的业务逻辑。
  • 不能报错,即使报错,不能影响原有的业务代码。
  • 对于耗时的日志代码,使用异步方法
  • 侵入性低,尽量少改动原始代码

Spring AOP

Spring AOP 通过切面编程实现不修改原有代码,而动态添加功能的能力。这种方式有以下几个好处:

  • 侵入性低
  • 可重用性强

本文使用基于注解的 AOP,首先定义一个切面注解 AopTest:

/*** 切面注解*/
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface AopTest {
}

再创建通知 @Around :

@Around("@annotation(com.test.annotation.AopTest)")
public Object annotationTest(ProceedingJoinPoint joinPoint) throws Throwable {log.info("执行前");Object result = joinPoint.proceed(); // 执行目标方法Object[] args = joinPoint.getArgs();log.info("执行后");return result;
}

一般都会在执行后添加日志即可,想要在那个方法或者接口加日志,只需要在方法上添加注解即可,比如在接口添加注解:

@GetMapping
@AopTest
public String first(String param) {log.info("执行first方法");return "result " + param;
}

请求接口后,就有如下的输出:

执行前
执行first方法
执行后

但是切面有一个问题,执行切面报错,方法也无法执行,就需要捕获异常,保证业务代码正常执行,改造一下上面的通知:

@Around("@annotation(com.test.annotation.AopTest)")
public Object annotationTest(ProceedingJoinPoint joinPoint) throws Throwable {log.info("执行前");log.info("执行前");Object result = joinPoint.proceed(); // 执行目标方法try {Object[] args = joinPoint.getArgs();// 添加日志log.info("执行后");int a = 1/0;} catch (Exception e) {log.error(e.getMessage());}return result;
}

改造后,即使切面报错,也不会影响业务代码的执行了。

AOP 是同步执行的,如果日志添加是一个比较耗时的操作,也会影响接口的响应速度,此时可以使用异步的方式,比如消息队列。

总结一下,Spring AOP 有以下几个优点和缺点。

  • 优点:

    • 侵入性低
    • 可重用性强

缺点及解决方案:

1、切面报错可能会影响业务代码

  • 问题:在切面的异常如果没有正确处理,可能会影响业务代码的正常执行。
  • 解决方案:
    • 捕获异常,确保业务代码正常执行
    • 一般使用try catch 捕获异常,防止向上传播

2、同步执行会影响接口响应速度

  • 问题:如果切面中存在耗时的操作,同步操作会导致接口的响应速度变慢。
  • 解决方案:
    • 通过消息队列将耗时操作异步执行
    • 使用 @Async 将方法异步执行,将任务从主线程脱离出来,交给其他线程池执行

事件监听 + 异步

Spring 事件监听机制是一种发布-订阅模式,将事件的发布和监听解耦开来。通过这种机制,事件的发布者无需关注监听的逻辑,监听者也无需直接依赖发布者。

Spring 事件监听有三个部分组成:

  1. 事件

自定义一个事件,继承 ApplicationEvent:

@Getter
@Setter
public class DemoEvent extends ApplicationEvent {private String name;public DemoEvent(Object source) {super(source);}
}
  1. 事件监听

基于 @EventListener 注解监听事件:

@Component
@Slf4j
public class DemoEventListener {@EventListenerpublic void handleEvent(DemoEvent event){log.info(event.getName());log.info("事件监听");}
}
  1. 事件发布

使用 applicationEventPublisher.publishEvent 方法发布事件,


@Autowired
private ApplicationEventPublisher applicationEventPublisher;@Override
public void publish() {// 执行业务代码log.info("执行登录,当前时间 {}",LocalTime.now());DemoEvent event = new DemoEvent(this);event.setName("hello");applicationEventPublisher.publishEvent(event);log.info("完成登录,当前时间 {}",LocalTime.now());log.info("执行 service");
}

配置好事件的发布和监听之后,在业务代码添加事件的发布,监听方法内添加日志的记录。

Spring 事件监听虽然解耦了发布和监听,只是解耦逻辑代码,两者还是同步执行,并且都是在同一个线程执行的,所以事件监听也无法解决添加日志报错,以及耗时的问题。

  1. 验证监听方法是否同步

在事件监听添加延迟:

  @EventListenerpublic void handleEvent(DemoEvent event){try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}log.info(event.getName());log.info("事件监听");}

控制台输出:

执行登录,当前时间 16:52:30.799
hello
事件监听
完成登录,当前时间 16:52:33.799
执行 service

接口执行了 3 秒多,并且 publish 方法要等待监听方法执行完毕之后才能执行,说明事件监听是同步的

  1. 验证监听方法报错是否会影响主流程

在监听方法添加错误代码:

@EventListener
public void handleEvent(DemoEvent event){int a = 1/0;log.info(event.getName());log.info("事件监听");}

控制台输出:

执行登录,当前时间 17:10:08.396
java.lang.ArithmeticException: / by zero

监听方法报错,接口也报错,业务代码无法执行,说明监听方法报错会影响事件发布方法

解决报错的问题,使用异常捕获即可。而延迟的问题,就需要使用到异步的操作,异步就是另启一个线程执行监听方法,异步除了能解决延迟的问题,也顺便解决了报错的问题。

实现异步在监听方法上添加 @Async 异步注解,监听方法添加延迟和错误代码:

执行登录,当前时间 17:21:50.971
完成登录,当前时间 17:21:50.974
执行 service

publish 方法既不会延迟,也不会因为监听报错影响执行,异步完美解决耗时和报错的问题

消息队列

海量日志场景,消息队列是一个很好的选择,它也是解耦了发布者和订阅者,如果订阅者开启了手动确认,消费者也需要使用 try catch 捕获异常信息,确保消息能正常消费。

总结

本文介绍几种日志记录的实现方案:

  • Spring AOP:
    • 优点: 侵入性低,代码可重复性强
    • 问题以及解决方案:
      • 切面中可能会报错,报错会影响业务代码的正常执行,解决方法是使用 try catch 捕获异常。
      • 日志记录会影响业务代码执行效率,可以使用消息队列异步执行日志操作
  • 事件监听 + 异步
    • 优点: 解耦业务逻辑和日志记录,提升代码的内聚性。
    • 缺点以及解决方案:
      • AOP 存在的问题,事件监听同样存在,报错和耗时都会影响业务代码。报错可以使用异常捕获,延迟问题可以使用异步方式解决,而异步另起线程也顺便解决了报错影响业务代码的问题。
  • 消息队列
    • 优点: 使用于高并发日记记录场景
    • 问题: 增加系统的复杂性和稳定性,还需要考虑消息的丢失和重复消费问题。

相关文章:

Java日志记录几种实现方案

在平时使用到一些软件中,比如某宝或者某书,通过记录用户的行为来构建和分析用户的行为数据,同时也能更好优化产品设计和提升用户体验。比如在一个订单系统中,需要确定追踪用户的行为,比如: 登录/登出浏览商…...

【C++算法】32.前缀和_矩阵区域和

文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 1314. 矩阵区域和 题目描述: 解法 防止有人看不明白题目,先解释一下题目 二维前缀和思想: 使用前缀和矩阵 ret [x1,y1]~[x2,y2] D …...

30天学会Go--第7天 GO语言 Redis 学习与实践

30天学会Go–第7天 GO语言 Redis 学习与实践 文章目录 30天学会Go--第7天 GO语言 Redis 学习与实践前言一、Redis 基础知识1.1 Redis 的核心特性1.2 Redis 常见使用场景 二、安装 Redis2.1 在 Linux 上安装2.2 在 Windows 上安装2.3 使用 Docker 安装 Redis 三、Redis 常用命令…...

面经自测——死锁/死锁的必要条件/死锁的预防/进程通信的方式

前言 本文是作者专门用来自测Java后端相关面试题的,所有问题都是在牛客、知识星球或网上找到的最近最新的面试题,全文回答都是作者按自己的真实水平仿照真实环境的回答,所以答案不一定真实(但回答一定真诚🤣&#xff0…...

Mysql索引,聚簇索引,非聚簇索引,回表查询

什么是索引 数据库索引是为了实现高效数据查询的一种有序的数据数据结构,类似于书的目录,通过目录可以快速的定位到想要的数据,因为一张表中的数据会有很多,如果直接去表中检索数据效率会很低,所以需要为表中的数据建立…...

Spring完整知识三(完结)

Spring集成MyBatis 注意 Spring注解形式集成MyBatis时,若SQL语句比较复杂则仍采用映射文件形式书写SQL语句;反之则用注解形式书写SQL语句,具体可详见Spring注解形式 环境准备相同步骤 Step1: 导入相关坐标,完整pom.…...

kafka-clients之ConsumerConfig

Kafka ConsumerConfig 中的配置项用于定义消费者的行为&#xff0c;如消费方式、偏移管理、组协调等。以下是ConsumerConfig中的关键配置项及其详细说明&#xff1a; 1. bootstrap.servers 类型&#xff1a;List<String>说明&#xff1a;Kafka集群的地址列表&#xff0…...

关于“浔川AI翻译”使用情况的调研报告

关于“浔川 AI 翻译”使用情况的调研报告 随着全球化进程加速及外语学习需求攀升&#xff0c;AI 翻译工具愈发普及。“浔川 AI 翻译”作为行业产品之一&#xff0c;为了解其市场表现与用户反馈&#xff0c;特开展本次问卷调查&#xff0c;现将关键结果汇报如下。 一、样本概…...

第一节、电路连接【51单片机-TB6600驱动器-步进电机教程】

摘要&#xff1a;本节介绍如何搭建一个51单片机TB6600驱动器步进电机控制电路&#xff0c;所用材料均为常见的模块&#xff0c;简单高效的方式搭建起硬件环境 一、硬件清单 ①51单片机最小控制系统 ②USB转TTL模块 ③开关电源 ④TB6600步进电机驱动器 ⑤二相四线步进电机 ⑥电…...

编程之路,从0开始:补充篇

Hello大家好&#xff01;很高兴和大家又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《题海拾贝》、《数据结构与算法之美》 欢迎点赞&#xff0c;关注&#xff01; 这篇…...

<script src = “https://cdn.jsdelivr.net/npm/vue/dist/vue.js“></script>

这行代码是HTML中的一个<script>标签&#xff0c;用于在网页中嵌入Vue.js库。具体来说&#xff1a; <script>&#xff1a;是HTML中的一个标签&#xff0c;用于定义客户端的脚本&#xff0c;比如JavaScript。 src&#xff1a;是<script>标签的一个属性&#…...

RabbitMQ延时队列

RabbitMQ延时队列 什么是延时队列 延时队列顾名思义&#xff0c;即放置在该队列里面的消息是不需要立即消费的&#xff0c;而是等待一段时间之后取出消费。 应用场景 场景一&#xff1a;在订单系统中&#xff0c;一个用户下单之后通常有30分钟的时间进行支付&#xff0c;如…...

Java——异常机制(下)

1 异常处理之(捕获异常) (一般处理运行时异常) (try-catch-finally子句) (finally一般用于文件最后关闭) (catch捕获的子类在前父类在后——>不然父类在前面都让父类捕获掉了&#xff0c;会报错) (Exception是父类放在最后&#xff0c;如果前面没有捕获到&#xff0c;就…...

9. 一分钟读懂“策略模式”

9.1 模式介绍 策略模式是一种行为型设计模式&#xff0c;用于在运行时灵活切换对象的行为或算法&#xff0c;它将算法封装为独立的类&#xff0c;使得它们可以互相替换&#xff0c;而不会影响使用这些算法的客户端代码。 策略模式的核心思想是&#xff1a;定义一系列可互换的算…...

python调用GPT-4o实时音频 Azure OpenAI GPT-4o Audio and /realtime

发现这块网上信息很少&#xff0c;记录一下 微软azure入口 https://learn.microsoft.com/zh-cn/azure/ai-services/openai/realtime-audio-quickstart?pivotsprogramming-language-ai-studio sdk文档 https://github.com/azure-samples/aoai-realtime-audio-sdk?tabread…...

linux查看应用程序执行时间

命令 ps -eo pid,comm,lstart,etime,args | grep -i java ps&#xff1a;是查看进程状态的命令。-eo&#xff1a;是-e和-o参数的组合&#xff0c;-e表示显示所有进程&#xff0c;-o后面跟的是自定义输出格式。pid&#xff1a;表示进程ID。comm&#xff1a;表示命令名&#x…...

mybatis之数据统计与自定义异常处理

文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计&#xff0c;在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍&#xff0c;本次要使用其进…...

Jenkins 中自定义Build History中显示构建信息

有时候会遇到一个代码仓库下面会有多个不同的分支&#xff0c;而这写分支表示着不同的开发者在开发新的需求&#xff0c;但是这样就会出现一个问题&#xff0c;在Jenkins上进行多分支构建的时候&#xff0c;很难找到哪一个是属于自己分支构建的&#xff0c;这样的问题大家应该都…...

安装certbot(ubuntu系统)

安装nginx 更新软件包列表 sudo apt update 更新软件包列表 sudo apt install nginx 更新软件包列表 sudo systemctl status nginx 注意&#xff1a;强烈推荐使用&#xff0c;系统直接安装nginx&#xff0c;&#xff08;不推荐使用docker安装nginx&#xff09;为后续更简单…...

QTextBrowser按照段落来显示html的文字

在 PyQt5 中&#xff0c;QTextBrowser 是一个用来显示富文本&#xff08;如 HTML&#xff09;内容的小部件。要让 QTextBrowser 按照段落来显示 HTML 内容&#xff0c;可以确保 HTML 中的每个段落被正确地封装在 <p> 标签中或其他合适的 HTML 标签中。 基本思路 HTML 格…...

如何让Google快速收录你的页面?

要让Google更快地收录你的网站内容&#xff0c;首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具&#xff0c;如果你的页面质量高且更新频率稳定&#xff0c;那么Google爬虫更可能频繁光顾。通常情况下&#xff0c;通过Google Search Console&…...

用Linux完成firewall-cmd配置防火墙

注意这里是openeuler的系统 假设在内网架设了一台Web服务器,IP地址是192.168.1.2,端口是80,设置内网网段192.168.1.0/24中的主机均可以访问此Web服务器,如图所示 步骤如下&#xff08;包含结果&#xff09; 这里再服务端&#xff08;192.168.131.10&#xff09;上配置&#x…...

关于光速的猜想

光速实际也可能是爱因斯坦制造出来的一个量&#xff0c;就像质量&#xff08;重力mg&#xff0c;有这个关系在&#xff0c;m起的名字后来就演变成了质量&#xff09;是牛顿造出的一个量&#xff0c;一个常量&#xff0c;刚开始都叫c&#xff0c;只是习以为常后起了个名字罢了&a…...

Mybatis-Flex的简单入门,Mybatis-Flex和其它框架对比

前言 最近做项目&#xff0c;项目组必须要用Mybatis-Flex&#xff0c;然后自己去学了一下&#xff0c;给大家进行分享。 MyBatis-Flex 是 MyBatis 的一个增强工具&#xff0c;旨在简化 MyBatis 的使用并提高开发效率。它通过提供一系列的便捷方法和特性来减少重复代码的编写&am…...

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…...

linux的磁盘管理

认识磁盘 从外到内&#xff0c;磁道从0~XXX。扇区默认512字节先读完一个柱面的0号磁道&#xff0c;接着读第二个柱面的0号磁道……直至所有柱面的0号磁道读写完毕&#xff0c;进入下一个磁道。 磁盘命名规则 物理磁盘:sd开头&#xff1b;虚拟磁盘vd开头 sdb1&#xff1a;第二…...

Alibaba EasyExcel 导入导出全家桶

一、阿里巴巴EasyExcel的优势 首先说下EasyExcel相对 Apache poi的优势&#xff1a; EasyExcel也是阿里研发在poi基础上做了封装&#xff0c;改进产物。它替开发者做了注解列表解析&#xff0c;表格填充等一系列代码编写工作&#xff0c;并将此抽象成通用和可扩展的框架。相对p…...

使用Scala编写一个简单的决策树分类测试demo

使用Scala编写一个简单的决策树分类测试demo&#xff0c;我们可以基于Apache Spark的MLlib库来实现。这里将展示如何创建一个简单的决策树分类器&#xff0c;并用它来进行预测。我们将遵循以下步骤&#xff1a; 设置环境和导入必要的包。加载并准备数据集。构建决策树模型。使…...

SQLServer中使用ISNULL替换为指定的替换值

ISNULL (Transact-SQL) 适用于&#xff1a; SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Microsoft Fabric 中的仓库 NULL替换为指定的替换值。 1、语法 ISNULL ( check_expression , rep…...

69 mysql 中 is null 的实现

前言 Mysql 中我们偶尔会用到 字段为 NULL 的情况 这时候 我们只能使用查询 “select * from tz_test_02 where field1 is null;” 来进行 field1 字段为 null 的行的查询 然后如果是使用 “select * from tz_test_02 where field1 null;” 你会发现查询 不出数据 但是如…...

【信息系统项目管理师】第9章:项目范围管理-基础和过程 考点梳理

文章目录 9.1 管理基础9.1.1 产品范围和项目范围9.1.2 管理新实践 9.2 项目范围管理过程9.2.1 过程概述9.2.2 裁剪考虑因素9.2.3 敏捷与适应方法 【学习建议】本章节内容属于10大管理知识领域&#xff0c;选择、案例、论文都会考&#xff0c;建议重点学习。项目范围管理包括确保…...

智能制造标准体系建设指南

一、智能制造系统架构总览 智能制造作为当今制造业转型升级的核心&#xff0c;深度整合了新一代信息技术与传统制造工艺&#xff0c;催生出一个横跨产品全生命周期、纵贯多层级组织架构&#xff0c;并彰显多元智能特性的复杂系统。这一架构从生命周期、系统层级、智能特征三个…...

怎么获取键值对的键的数值?

问&#xff1a; 通过paelData.cardMap.C0002112可以获取到Cooo2112里面的数据&#xff0c;但是有时候接口返回的不是C0002112而是C0002093或者其他值&#xff0c;请问我该怎么写&#xff1f; 后端返回的数据是这样的&#xff1a; cardMap: { C0002112: { name: Item 1, va…...

反向代理后Request.Url.AbsoluteUri获取成了内网IP

出现的问题&#xff1a;用户请求的是域名&#xff0c;而后端通过Request.Url.AbsoluteUri获取用户请求的绝对路径时&#xff0c;变成了内网IP 解决方式&#xff1a; 反向代理配置中加上&#xff1a; proxy_set_header Host $host; # proxy_set_header Host h o s t : host: h…...

NLP论文速读(斯坦福大学)|使用Tree将语法隐藏到Transformer语言模型中正则化

论文速读|Sneaking Syntax into Transformer Language Models with Tree Regularization 论文信息&#xff1a; 简介&#xff1a; 本文的背景是基于人类语言理解的组合性特征&#xff0c;即语言处理本质上是层次化的&#xff1a;语法规则将词级别的意义组合成更大的成分的意义&…...

OpenCV-图像阈值

简单阈值法 此方法是直截了当的。如果像素值大于阈值&#xff0c;则会被赋为一个值&#xff08;可能为白色&#xff09;&#xff0c;否则会赋为另一个值&#xff08;可能为黑色&#xff09;。使用的函数是 cv.threshold。第一个参数是源图像&#xff0c;它应该是灰度图像。第二…...

window系统,照片应用打开图片,但是提示操作系统找不到已输入的环境选项,请问怎么解决,以便能打开图片

文章目录 问题描述问题解决一、先用AI提问&#xff0c;看能否得到解答二、最终的解决方法-修改环境变量 至此问题解决。 问题描述 Windows中&#xff0c;使用默认的图片应用打开图片时&#xff0c;提示&#xff1a; 操作系统找不到已输入的环境选项如下图&#xff1a; 这个问…...

Excel之查找函数-XLOOKUP

背景&#xff1a; 某些数据处理&#xff0c;需要对比两个乱序或者数据不完全相同的数值&#xff0c;取到另外一个数据值&#xff0c;数据量大的情况下&#xff0c;人工对比太耗时&#xff0c;XLOOKUP函数是一个查找函数&#xff0c;可以通过遍历对比某一单元格的值&#xff0c…...

深入理解 Java 内存管理:堆和栈

深入理解 Java 内存管理&#xff1a;堆和栈的全面解析 在 Java 编程语言中&#xff0c;内存管理是一个至关重要的概念&#xff0c;其中堆&#xff08;Heap&#xff09;和栈&#xff08;Stack&#xff09;是两个核心的内存区域。理解它们的工作原理、用途以及它们在程序执行过程…...

深度全解析开放开源大模型之BLOOM

BLOOM是 BigScience Large Open-science Open-access Mul-tilingual Language Model首字母的缩写。 BigScience 不是财团&#xff08;consortium&#xff09;&#xff0c;也不是正式成立的实体。这是一个由HuggingFace、GENCI和IDRIS发起的开放式协作组织&#xff0c;以及一个…...

下载谷歌浏览器的官方离线安装包

网址&#xff1a;https://support.google.com/chrome/answer/95346?hlzh-Hans&coGENIE.Platform%3DDesktop#zippy%2Cwindows...

ORACLE创建用户报错ORA-65096: invalid common user or role name

在高版本的oracle中创建用户时提示错误ORA-65096: invalid common user or role name&#xff0c;官网说明用户名必须使用C##或c##开头。以下方法亲测有效。 通过设置"_ORACLE_SCRIPT"参数为true来临时绕过CDB中创建用户必须以"C##"开头的限制。请注意&…...

河工oj第七周补题题解2024

A.GO LecturesⅠ—— Victory GO LecturesⅠ—— Victory - 问题 - 软件学院OJ 代码 统计 #include<bits/stdc.h> using namespace std;double b, w;int main() {for(int i 1; i < 19; i ) {for(int j 1; j < 19; j ) {char ch; cin >> ch;if(ch B) b …...

运维大屏与设备仪表盘:打造高效运维管理的视觉中枢

在快速发展的信息化时代&#xff0c;运维行业面临着前所未有的挑战。随着业务规模的不断扩大和系统复杂度的日益增加&#xff0c;如何高效、准确地监控和管理设备运行状态&#xff0c;成为运维团队亟待解决的问题。运维大屏与设备仪表盘作为运维管理的重要工具&#xff0c;为运…...

计算机视觉与医学的结合:推动医学领域研究的新机遇

目录 引言医学领域面临的发文难题计算机视觉与医学的结合&#xff1a;发展趋势计算机视觉结合医学的研究方向高区位参考文章结语 引言 计算机视觉&#xff08;Computer Vision, CV&#xff09;技术作为人工智能的重要分支&#xff0c;已经在多个领域取得了显著的应用成果&…...

使用setsockopt函数SO_BINDTODEVICE异常,Protocol not available

前言 最近在使用OLT的DHCP Server的时候发现一些异常现象&#xff0c;就是ONU发的一个vlan的discover包其他不同vlan的DHCP地址池也会收到&#xff0c;导致其他服务器也发了offer包&#xff0c;ONU同时会有多个ip地址。一开始是没有使用SO_BINDTODEVICE&#xff0c;后面查到使…...

rpm包转deb包或deb包转rpm包

Debian系&#xff08;Ubuntu、Deepin、麒麟Destop等&#xff09;用的安装包是deb的&#xff0c;Red Hat系&#xff08;CentOS、欧拉、麒麟Server等&#xff09;用的安装包是rpm的。 如果需要在Ubuntu上安装rpm&#xff0c;或需要在CentOS上安装deb&#xff0c;需要安装alien s…...

ChatGPT 和文心一言哪个更好用?

ChatGPT vs 文心一言&#xff1a;哪个更好用&#xff1f; 引言 在人工智能蓬勃发展的今天&#xff0c;聊天机器人已经成为我们生活和工作中不可或缺的一部分。你可能听说过ChatGPT和文心一言这两个热门的聊天机器人&#xff0c;它们分别来自OpenAI和百度。那么&#xff0c;究…...

T113-S3 Tina 存储类型修改

前面介绍了如何在 Tina 中添加新的板子&#xff0c;本节介绍如何修改板子存储类型。 1、确定存储类型 Tina 支持多种存储类型&#xff0c;包括 SD 卡、eMMC、SPI NAND、SPI NOR 等。在添加板子之前&#xff0c;需要确定板子使用的存储类型。 存储类型修改 在 device/config/…...

【css】基础(一)

本专栏内容为&#xff1a;前端专栏 记录学习前端&#xff0c;分为若干个子专栏&#xff0c;html js css vue等 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;css专栏 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库&#x1f69a; &a…...