Logback框架基本认识

news2024/11/19 13:25:36

文章目录

  • 一.什么是Logback
    • 1.1 初识Logbcak
  • 二.Logbcak的结构
  • 三.日志的级别
  • 四.配置组件详解
    • 4.1 logger 日志记录器
      • 属性的介绍
      • 如何在配置文件里配置
    • 4.2 appender 附加器 配合日志记录器的输出格式
      • 4.2.1 控制台附加器
      • 4.2.2 文件附加器
      • 4.3.3滚动文件附加器
    • 4.3 Filter: 过滤器,用于根据指定的条件过滤日志。
  • 五.springboot整合logbcak

一.什么是Logback

Logback 旨在作为流行的 log4j 项目的继承者。它是由 log4j 的创始人 Ceki Gülcü 设计的。它建立在十年来设计工业级测井系统的经验之上。由此产生的产品,即 logback,比所有现有的日志系统速度更快,占用空间更小,有时甚至相差很大。同样重要的是,logback 提供了其他日志系统所缺少的 独特且相当有用的功能。

看了上述文字的说明,我们是否对logback还有些困惑,我们可以开始使用logback的第一个程序,来认识一下logbcak

1.1 初识Logbcak

  • 1.创建Maven项目
    在这里插入图片描述

  • 2.增加maven依赖

    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.11</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.36</version>
    </dependency>
  • 3.新建第一个helloword程序
package com.gongli;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Hello world!
 *
 */

public class App {


    private static final Logger logger
            = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        logger.info("hello world");
    }
}

这段代码展示了如何使用日志记录器来记录程序的运行信息。它创建了一个名为 App 的类,并在其中定义了一个 main 方法。在 main 方法中,它使用 LoggerFactory 类获取了一个日志记录器对象,并使用该对象记录了一条信息日志。

二.Logbcak的结构

认识到第一个日入门日志以后,我们就开始认识Logbcak的结构。如图:
在这里插入图片描述

Logger, Appender 和 Layouts

Logback 构建在三个主要的类上:Logger,Appender 和 Layouts。这三个不同类型的组件一起作用能够让开发者根据消息的类型以及日志的级别来打印日志。
Logger 类作为 logback-classic 模块的一部分。Appender 与 Layouts 接口作为 logback-core 的一部分。作为一个通用的模块,logback-core 没有 logger 的概念。

三.日志的级别

在具体了解日志配置文件之间,我们必须先知道日志的级别是什么?
日志级别用于控制哪些日志会被记录。日志级别从高到低依次为:

FATAL: 致命错误,表示程序无法继续运行。
ERROR: 错误,表示程序发生了错误,但仍能继续运行。
WARN: 警告,表示程序可能发生错误,但不影响程序的正常运行。
INFO: 信息,用于记录程序的正常运行状态。
DEBUG: 调试,用于记录程序的运行细节。
TRACE: 跟踪,用于记录程序的运行轨迹。

大小从上往下依次减小,这条规则是 logback 的核心。它假设级别按如下顺序排序: TRACE < DEBUG < INFO < WARN < ERROR。

例如以下程序,我设父类日志的级别为error ,你猜一下子类的日志级别info会正常输出吗?

    public static void main(String[] args) {
        //我设父类的日志级别为Info
        ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com");
        logger1.setLevel(Level.ERROR);
        logger1.info("hello world");
    }

答案是显然不会
在这里插入图片描述
我们再来做一个实验,如果我们指定了根的日志级别,也指定了根的子类级别。你想想看我们的日志级别是遵守根的,还是遵守子类的呢?话不多说,我们来试试看。

  public static void main(String[] args) {
        //我设父类的日志级别为Info
        ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.gongli.App");
        ch.qos.logback.classic.Logger rootlogger=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
        rootlogger.setLevel(Level.WARN);
        logger1.setLevel(Level.INFO);
        System.out.println(logger1.getEffectiveLevel());
        logger1.trace("hello world");
    }

事实证明,在我子类设置的情况下,我们会遵循子类的日志级别
在这里插入图片描述
从而我们得出一个结论,如果子类包没设置级别,就会往上一级找,如果上一级也没设置,就默认日志级别打印。
在这里插入图片描述

四.配置组件详解

4.1 logger 日志记录器

属性的介绍

每个记录器Logger的属性有两个属性

  • name属性:记录器的名称

  • level尾性(可选): 记录的级别,允许的级别从低到高,TRACE< DEBUG<INFO< WARN<ERROR
    logger.setLevel()
    logger.getLevel():
    logger.getEffectiveLevel()
    additivity属性(可选): 是否允许爱加打印日志,true或false

  • 说明:
    1)如果记录器未设置level属性,则该记录器的级别从上级记录器继承
    2)如果想查看记录器的级别,应该通过logger.getEffectiveLevel方法,同时要将Logger转为
    ch.qos.logback.classic.Logger类型,如下:
    ch.gos.logbackclassic.Logger logger =
    (ch.qos.logbackclassic.Logger) LoggerFactory.getLogger(App.class);

举一个代码的例子,你们就懂我在说什么了

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class App {

    private static final Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        // 设置 logger 的名称
        logger.setName("MyLogger");

        // 设置 logger 的级别
        logger.setLevel(Level.INFO);

        // 获取 logger 的级别
        Level level = logger.getLevel();

        // 获取 logger 的有效级别
        Level effectiveLevel = logger.getEffectiveLevel();

        // 检查 logger 的 additivity 属性
        boolean additivity = logger.isAdditive();

        System.out.println("logger 的名称:" + logger.getName());
        System.out.println("logger 的级别:" + level);
        System.out.println("logger 的有效级别:" + effectiveLevel);
        System.out.println("logger 的 additivity 属性:" + additivity);
    }
}

如何在配置文件里配置

使用logback-test.xml或 logback.xml进行配置
这里分为两步
1.新建一个logback.xml
文件内容如下:

<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=
        "http://www.padual.com/java/logback.xsd">
    <root level="debug"> // 设置root的
    </root>
    <logger name="com.aa" level="error"></logger> //声明一个记录器
</configuration>

2.编写java代码

 public static void main(String[] args) {
        ch.qos.logback.classic.Logger rootlogger=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("root");
        System.out.println(rootlogger.getEffectiveLevel());
        ch.qos.logback.classic.Logger logger=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.aa");
        System.out.println(logger.getEffectiveLevel());

    }
}

4.2 appender 附加器 配合日志记录器的输出格式

Logback 将写入日志事件的任务委托给称为附加程序的组件。Appender 必须实现该日志记录器的 接口。
常用的附加器如下:
控制台附加器:ch.qos.logback.core.ConsoleAppender
文件附加器: ch.qos.logback.core.FileAppender
滚动文件附加器: ch.gos.logback.core.rolling.RollingFileAppender

4.2.1 控制台附加器

控制台附加器(ch.qos.logback.core.ConsoleAppender)的常用参数如下:

name:附加器的名称。
encoder:编码器。
target:目标。默认为 System.out。
encoding:编码。默认为 UTF-8。
immediateFlush:是否立即刷新。默认为 true。
filter:日志过滤器。
以下是这些参数的具体说明:

  • name
    name 属性指定附加器的名称。名称用于标识附加器。

  • encoder
    encoder 属性指定编码器。编码器用于格式化日志。

  • target
    target 属性指定目标。目标用于指定日志输出的位置。默认为 System.out。

  • encoding
    encoding 属性指定编码。编码用于指定日志的编码格式。默认为 UTF-8。

  • immediateFlush
    immediateFlush 属性指定是否立即刷新。如果为 true,则日志将在写入到控制台之前立即刷新。如果为 false,则日志将在缓冲区满时刷新。

  • filter
    filter 属性指定日志过滤器。日志过滤器用于过滤日志。
    例子:
    logback.xml文件配置如下

<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=
        "http://www.padual.com/java/logback.xsd">
      //这里就是声明控制台附加器
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder> //日志格式化格式
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
        </encoder>
    </appender>
    <logger name="com.gongli" level="info">
    //加入附加器
    <appender-ref ref="STDOUT" />
    </logger>
</configuration>

代码如下:

   public static void main(String[] args) {
        ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.gongli.App");
        logger1.info("hello world");
    }
}

在这里插入图片描述

4.2.2 文件附加器

文件附加器(ch.qos.logback.core.FileAppender)的常用参数如下:

name:附加器的名称。
file:日志文件的路径。
append:是否追加日志。默认为 true。
encoder:编码器。
rollingPolicy:滚动策略。
filter:日志过滤器。
以下是这些参数的具体说明:

  • name
    name 属性指定附加器的名称。名称用于标识附加器。

  • file
    file 属性指定日志文件的路径。

  • append
    append 属性指定是否追加日志。如果为 true,则日志将追加到现有文件中。如果为 false,则日志将覆盖现有文件。

  • encoder
    encoder 属性指定编码器。编码器用于格式化日志。

  • rollingPolicy
    rollingPolicy 属性指定滚动策略。滚动策略用于控制日志文件的滚动方式。

  • filter
    filter 属性指定日志过滤器。日志过滤器用于过滤日志。
    例子
    logbcak.xml文件

<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation=
        "http://www.padual.com/java/logback.xsd">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
        </encoder>
    </appender>
    <appender name="File" class="ch.qos.logback.core.FileAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
        </encoder>
        <file>myfile.log</file>//文档
        <append>true</append> //是否追加数据
    </appender>
    <logger name="com.gongli" level="info">
    <appender-ref ref="STDOUT" />
        <appender-ref ref="File" />
    </logger>
</configuration>

java代码

  public static void main(String[] args) {
        ch.qos.logback.classic.Logger logger1=( ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.gongli.App");
        logger1.info("hello world");
    }
}

在这里插入图片描述

4.3.3滚动文件附加器

这里要特别说明一下这几个参数
Logback 提供了多种滚动策略,包括:
SizeBasedRollingPolicy:根据文件大小滚动日志文件。(ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy)
TimeBasedRollingPolicy:根据时间滚动日志文件。(ch.qos.logback.core.rolling.TimeBasedRollingPolicy)
说说他们之间的区别
区别

SizeBasedRollingPolicy 和 TimeBasedRollingPolicy 的主要区别在于滚动触发条件的不同。SizeBasedRollingPolicy 的滚动触发条件是文件大小,而 TimeBasedRollingPolicy 的滚动触发条件是时间。
例如:

<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/myapp.log</file>
    <append>true</append>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        <maxFileSize>10MB  </maxFileSize>
        </maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

在上述配置中,maxFileSize 属性指定日志文件的最大大小为 10MB。当日志文件的大小达到 10MB 时,将会创建一个新的日志文件,并将原来的日志文件重命名为 myapp.log.1。

<appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>/var/log/myapp.log</file>
    <append>true</append>
    <encoder>
        <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>myapp.log.%d{yyyy-MM-dd}</fileNamePattern>
        <maxHistory>30</maxHistory>
    </rollingPolicy>
</appender>

在上述配置中,fileNamePattern 属性指定新日志文件的文件名模式为 myapp.log.yyyy-MM-dd。也就是说,每天将会创建一个新的日志文件。

4.3 Filter: 过滤器,用于根据指定的条件过滤日志。

过滤器是附加器的一个组件,它用于决定附加器是否输出日志。一个附加器可以包合一个或多个过滤器。
每个过滤器都会返回一个枚举值,可选的值: DENY、 NEUTRAL、ACCEPT
附加器根据过滤器返回值判断是否输出日志:
DENY : 不输出日志
ACCEPT: 输出日志
NEUTRAL : 中立,即不决定是否输出日志

常用的过滤器如下:
LevelFilter(级别过滤器): 实现类 ch.qos.logback.classic.filter.LevelFilter
ThresholdFilter(闽值过滤器): 实现类 ch.gos.logback.classic.filter.ThresholdFilter
EvaluatorFilter(评估者过滤器): 实现类 ch.qos.logback.core.filter.EvaluatorFilter
JaninoEventEvaluator过滤器: 实现类 ch.qos.logback.core.filter.EvaluatorFilter
TurboFilter涡轮过滤器
DuplicateMessageFilter 重复消息过滤器

这里举一个简单的例子LevelFilter(级别过滤器)

   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <OnMatch>ACCEPT</OnMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
          <logger name="com.gongli" level="info">
        <appender-ref ref="STDOUT" />
    </logger>
        

具体说明:
如果程序记录了一条 INFO 级别的日志,由于其级别与 level 属性匹配,会被 OnMatch 属性接受,因此会输出到控制台。
如果程序记录了一条 DEBUG 级别的日志,由于其级别低于 level 属性,会被 onMismatch 属性拒绝,因此不会输出到控制台。

五.springboot整合logbcak

Spring Boot 默认使用 Logback 作为日志框架。要将 Logback 整合到 Spring Boot 项目中,只需在项目的 pom.xml 文件中添加以下依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-logging</artifactId>
    </dependency>
</dependencies>

接下来,需要在项目的 application.properties 文件中配置 Logback。Logback 的配置文件格式为 XML。可以使用以下示例来配置 Logback:

logging.config=classpath:my-logback.xml

然后我们在resource下面新建my-logback.xml
文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>myapp.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n</pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>myapp.log.%d{yyyy-MM-dd}</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
    </appender>

    <logger name="com.example.myapp" level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </logger>

    <root level="INFO">
        <appender-ref ref="STDOUT" />
    </root>

</configuration>

如果大家想深入了解logbcak,建议去它的官网去看看,内容给很多,我把官网粘在这里里
https://logback.qos.ch/manual/introduction.html

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

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

相关文章

机器学习激活函数

激活函数 激活函数是人工神经网络中的一个重要组成部分。它们用于向神经网络中添加非线性因素&#xff0c;使得网络能够解决复杂问题&#xff0c;如图像识别、语言处理等。激活函数的作用是决定一个神经元是否应该被激活&#xff0c;也就是说&#xff0c;它帮助决定神经元的输…

大模型关于Lora论文集合

《Chain of LoRA:Efficient Fine-tuning of Language Models via Residual Learning》 Chain of LoRA (COLA)&#xff0c;这是一种受 Frank-Wolfe 算法启发的迭代优化框架&#xff0c;旨在弥合 LoRA 和全参数微调之间的差距&#xff0c;而不会产生额外的计算成本或内存开销。CO…

【清华社机器之心】视频生成前沿研究与应用特别活动

在视频生成即将迎来技术和应用大爆发之际&#xff0c;为了帮助企业和广大从业者掌握技术前沿&#xff0c;把握时代机遇&#xff0c;机器之心AI论坛就将国内的视频生成技术力量齐聚一堂&#xff0c;共同分享国内顶尖力量的技术突破和应用实践。 论坛将于2024.01.20在北京举办&am…

股东分红模式玩法解析!

股东分红模式股东分红模式是指公司通过向股东支付现金或股票的方式&#xff0c;将公司利润分配给股东的一种方式。不同的股东分红模式有着不同的特点和应用场景。 ​一、模式概述 一个私域电商平台&#xff0c;非常重要的一个角色是“团队长”&#xff0c;尤其是能够带动业绩和…

Win11安装与卸载Oracle 19c数据库

一、官网下载安装包 进入官网&#xff0c;选择产品-Oracle DataBase&#xff0c;点击进入下载界面 官网 二、安装 将下载的压缩包进行解压&#xff0c;解压路径随意即可 1 双击exe文件开始安装 等待出现如下页面 2 选择所示&#xff0c;点击下一步 3 选择桌面类安装 4 创…

openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题

文章目录 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时间运行的问题194.1 分析查询语句长时间运行的问题194.1.1 问题现象194.1.2 原因分析194.1.3 处理办法 openGauss学习笔记-194 openGauss 数据库运维-常见故障定位案例-分析查询语句长时…

leetcode动态规划(零钱兑换II、组合总和 Ⅳ)

518.零钱兑换II 给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。 示例 1: 输入: amount 5, coins [1, 2, 5] 输出: 4 解释: 有四种方式可以凑成总金额: 55 5221 52111 511111 示例 2: 输入: amount 3, coi…

conda安装和配置以及处理OSError: [WinError 123]异常

conda安装和配置 由于更换电脑&#xff0c;浅浅记录下conda安装和配置。以及处理这次安装的 OSError: [WinError 123] 异常。 conda的作用 下载之前&#xff0c;先了解下为什么需要使用conda&#xff0c;它是一个开源的Anaconda是专注于数据分析的Python发行版本&#xff0c;…

RK3399平台入门到精通系列讲解(驱动篇)eventpoll结构体详解

🚀返回总目录 文章目录 一、eventpoll 结构体二 、epitem 结构体三、eppoll_entry 结构体eventpoll 结构体:eventpoll 结构体是 epoll 在内核中的核心结构epitem 结构体:epitem 结构体用于表示 epoll 实例中的事件项eppoll_entry 结构体:它的作用就是关联Socket等待队列中…

VUE3相比VUE2升级了哪些内容

目录 一、Vue 3 、Vue 2 对比及提升项 二、 Vue 3 创建app.vue示例 三、Vue3 的setup、Vue2 的 data对比 一、Vue 3 、Vue 2 对比及提升项 性能提升&#xff1a;Vue 3 做了大量的优化工作&#xff0c;提升了运行时的性能。例如&#xff0c;在模板编译时进行的静态分析和优化…

DLinear模型:Are Transformers Effective for Time Series Forecasting?

本文发表于2022年8月份 Abstract 基于Transformer的长时间序列预测模型不断涌现&#xff0c;并且性能在过去几年力不断提高&#xff0c;但Transformer是否对长时间序列问题有效&#xff1f; 具体来说&#xff0c;Transformer是提取长序列中各元素间语义关联最成功的模型&…

模型评估:A/B测试的陷阱

互联网公司中&#xff0c;A/B测试是验证新模块、新功能、新产品是否有效&#xff1b;新算法、新模型的效果是否有提升&#xff1b;新设计是否受到用户欢迎&#xff1b;新更改是否影响用户体验的主要测试方法。在机器学习领域中&#xff0c;A/B测试是验证模型最终效果的主要手段…

js逆向第16例:猿人学第12题入门级js

文章目录 一、前言二、定位关键参数三、代码实现一、前言 任务:抓取这5页的数字,计算加和并提交结果 既然是入门级,那肯定很简单了 二、定位关键参数 控制台查看请求数据,m值应该就是关键参数了 进入堆栈 马上定位到了m值"m": btoa(yuanrenxue + window.pag…

商品源数据如何采集,您知道吗?

如今&#xff0c;电子商务已经渗透到了人们生活的方方面面。2020年新冠肺炎突如其来&#xff0c;打乱了人们正常的生产生活秩序&#xff0c;给经济发展带来了极大的影响。抗击疫情过程中&#xff0c;为避免人员接触和聚集&#xff0c;以“无接触配送”为营销卖点的电子商务迅速…

安达发|APS换产矩阵功能带来的便利

APS换产矩阵功能是一种在生产计划和排程中广泛应用的工具&#xff0c;它能够帮助企业实现生产过程的优化和效率提升。通过使用APS换产矩阵功能&#xff0c;企业可以更好地管理生产线上的资源&#xff0c;合理安排生产任务&#xff0c;提高生产效率和产品质量。 1&#xff0e;AP…

Spacedesk | 最新版本移动端扩展PC副屏

我的设备&#xff1a; 电脑:戴尔G15 5511、i7-11800H、Windows 11、RTX3060&#xff08;推荐显卡高级一些&#xff0c;算力差点的可能带不动这款软件&#xff09; 平板&#xff1a;荣耀V6、麒麟985、安卓10、分辨率2000*1200&#xff08;手机也行&#xff0c;我用的平板&…

Windows 双网卡链路聚合解决方案

Windows 双网卡链路聚合解决方案 链路聚合方案1&#xff1a;Metric介绍操作 方案2&#xff1a;NetSwitchTeam介绍操作 方案3&#xff1a;NIC介绍操作 方案4&#xff1a;Intel PROSet 链路聚合 指将多个物理端口汇聚在一起&#xff0c;形成一个逻辑端口&#xff0c;以实现出/入…

Overleaf Docker编译复现计划

Overleaf Docker编译复现计划 Overleaf Pro可以支持不同年份的Latex镜像自由选择编译&#xff0c;这实在是一个让人看了心痒痒的功能。但是很抱歉&#xff0c;这属于Pro付费功能。但是我研究了一下&#xff0c;发现其实和Docker编译相关的代码&#xff0c;社区版的很多代码都没…

Windows下Python+PyCharm+miniconda+Cuda/GPU 安装步骤

1. 官网安装Python 3.9 Python Release Python 3.9.0 | Python.org 2. 安装pycharm https://download.jetbrains.com/python/pycharm-professional-2023.3.2.exe 3. 安装miniconda Miniconda — miniconda documentation 4. 安装完miniconda 创建虚拟环境 conda create …

吴飞教授 人工智能 模型与算法 启发式搜索课件发散分析

一、文章介绍 本文是针对吴飞教授在MOOC课程 &#xff1a;《人工智能&#xff1a;模型与算法》 2.1节 启发式搜索的课前发散 在课程2.1节 启发式搜索章节中&#xff0c;吴飞教授以如何计算城市地图两点之间最短路径为例&#xff0c;重点讲授了贪婪最佳优先搜索和A*搜索算法&a…