log4j2 的使用【超详细图文】

article/2025/9/18 16:43:48

log4j2 的使用

Apache Log4j2 是对Log4j 的升级版本,参考了logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

  • 异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
  • 性能提升,log4j2 相较于log4j 和 logback 都具有明显的性能提升,有18倍性能提升,后面会有官方测试的数据。
  • 自动重载配置,参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
  • 无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制【对象重用、内存缓冲】,避免频繁的日志收集导致的 jvm gc。

官网:https://logging.apache.org/log4j/2.x/


一. Log4j2 入门

目前市面上最主流的日志门面就是SLF4J,虽然Log4j2 也是日志门面,因为它的日志实现功能非常强大,性能优越。所以大家一般还是将 Log4j2 看作是日志的实现,Slf4j + Log4j2 应该是未来的大势所趋

1.添加依赖

    <dependencies><!-- log4j2 日志门面 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.1</version></dependency><!-- log4j2 日志实面 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version></dependency><!-- junit 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

2.编写代码

package com.log;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.junit.Test;public class Log4j2Test {// 定义日志记录器对象public static final Logger LOGGER = LogManager.getLogger(Log4j2Test.class);// 快速入门@Testpublic void testQuick() throws Exception {// 日志消息输出LOGGER.fatal("fatal");LOGGER.error("error");LOGGER.warn("warn");LOGGER.info("info");LOGGER.debug("debug");LOGGER.trace("trace");}
}

3.运行结果截图

img

上述报错是因为没有找到日志配置文件,需要添加 log4j2.xml 配置文件到 resource 目录下【classpath】下。log4j2 默认加载classpath 下的 log4j2.xml 文件中的配置

<?xml version="1.0" encoding="UTF-8" ?>
<configuration status="warn" monitorInterval="5"><properties><property name="LOG_HOME">E:/logs</property></properties><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /></Console><File name="file" fileName="${LOG_HOME}/myfile.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /></File><RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /></RandomAccessFile><RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"filePattern="E:/logs/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log"><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n" /><Policies><OnStartupTriggeringPolicy /><SizeBasedTriggeringPolicy size="10 MB" /><TimeBasedTriggeringPolicy /></Policies><DefaultRolloverStrategy max="30" /></RollingFile></Appenders><Loggers><Root level="trace"><AppenderRef ref="Console" /></Root></Loggers>
</configuration>

实际生产中,我们往往需要 slf4j + log4j2 进行日志管理;就需要导入slf4j 日志门面、log4j2 适配器;然后使用 slf4j 方法接口名称来输出日志

    <dependencies><!-- 使用slf4j 作为日志门面 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.26</version></dependency><!-- 使用 log4j2 的适配器进行绑定 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j-impl</artifactId><version>2.9.1</version></dependency><!-- log4j2 日志门面 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-api</artifactId><version>2.11.1</version></dependency><!-- log4j2 日志实面 --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.11.1</version></dependency><!-- junit 单元测试 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>

编写 slf4j + log4j2 代码

package com.log;import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Slf4jTest {// 为了保证使用时,不需要每次都去创建logger 对象,我们声明静态常量public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);// 快速入门@Testpublic void testQuick(){// 日志输出LOGGER.error("error");LOGGER.warn("warning");LOGGER.info("info");    // 默认的日志级别信息LOGGER.debug("debug");LOGGER.trace("trace");  // 追踪信息// 使用占位符输出日志信息String name = "java_log";Integer age = 18;LOGGER.info("用户:{},{}", name, age);// 将系统的异常信息输出try {int i = 1 / 0;} catch (Exception e){// e.printStackTrace();LOGGER.error("出现异常:", e);}}
}

log4j2 vs slf4j + log4j2 日志输出对比:

img


二、Log4j2 配置

log4j2 默认加载classpath 下的 log4j2.xml 文件中的配置。下面通过log4j2.xml 配置文件进行测试

<?xml version="1.0" encoding="UTF-8" ?>
<!--status="warn" 日志框架本身的输出日志级别,可以修改为debugmonitorInterval="5" 自动加载配置文件的间隔时间,不低于 5秒;生产环境中修改配置文件,是热更新,无需重启应用-->
<configuration status="warn" monitorInterval="5"><!--集中配置属性进行管理使用时通过:${name}--><properties><property name="LOG_HOME">D:/logs</property></properties><!-- 日志处理 --><Appenders><!-- 控制台输出 appender,SYSTEM_OUT输出黑色,SYSTEM_ERR输出红色 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /></Console><!-- 日志文件输出 appender --><File name="file" fileName="${LOG_HOME}/myfile.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /></File><!-- 使用随机读写流的日志文件输出 appender,性能提高 --><RandomAccessFile name="accessFile" fileName="${LOG_HOME}/myAcclog.log"><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" /></RandomAccessFile><!-- 按照一定规则拆分的日志文件的appender -->  <!-- 拆分后的文件 --><!-- filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log"> --><RollingFile name="rollingFile" fileName="${LOG_HOME}/myrollog.log"filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd}-%i.log"><!-- 日志级别过滤器 --><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" /><!-- 日志消息格式 --><PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n" /><Policies><!-- 在系统启动时,出发拆分规则,生产一个新的日志文件 --><OnStartupTriggeringPolicy /><!-- 按照文件大小拆分,10MB --><SizeBasedTriggeringPolicy size="2MB" /><!-- 按照时间节点拆分,规则根据filePattern定义的 --><TimeBasedTriggeringPolicy /></Policies><!-- 在同一个目录下,文件的个限定为 30个,超过进行覆盖 --><DefaultRolloverStrategy max="10" /></RollingFile></Appenders><!-- logger 定义 --><Loggers><!-- 使用 rootLogger 配置 日志级别 level="trace" --><Root level="trace"><!-- 指定日志使用的处理器 --><!-- <AppenderRef ref="Console" />--><AppenderRef ref="file" /><AppenderRef ref="rollingFile" /><AppenderRef ref="accessFile" /></Root></Loggers>
</configuration>

编写代码:

package com.log;import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Slf4jTest {// 为了保证使用时,不需要每次都去创建logger 对象,我们声明静态常量public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);// 快速入门@Testpublic void testQuick(){// 日志输出for (int i = 0; i < 1000000; i++) {LOGGER.error("error");LOGGER.warn("warning");LOGGER.info("info");    // 默认的日志级别信息LOGGER.debug("debug");LOGGER.trace("trace");  // 追踪信息}// 使用占位符输出日志信息/*String name = "java_log";Integer age = 18;LOGGER.info("用户:{},{}", name, age);// 将系统的异常信息输出try {int i = 1 / 0;} catch (Exception e){// e.printStackTrace();LOGGER.error("出现异常:", e);}*/}
}

运行结果截图:

img

img


三、Log4j2 异步日志

异步日志

log4j2 最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益,我们来看看如何使用log4j2 的异步日志。

  • 同步日志

img

  • 异步日志

img

Log4j2 提供了两种实现日志的方式,一个是通过AsyncAppender【几乎没人用】,一个是通过AsyncLogger【主要是这个】,分别对应前面我们说的Appender 组件和Logger 组件。

官网详细介绍:http://logging.apache.org/log4j/2.x/performance.html

img

注意:配置异步日志需要添加依赖

        <!--异步日志依赖 --><dependency><groupId>com.lmax</groupId><artifactId>disruptor</artifactId><version>3.3.4</version></dependency>

1、AsyncAppender 方式【生产上几乎不使用,因为性能低下

<?xml version="1.0" encoding="UTF-8" ?>
<!--status="warn" 日志框架本身的输出日志级别,可以修改为debugmonitorInterval="5" 自动加载配置文件的间隔时间,不低于 5秒;生产环境中修改配置文件,是热更新,无需重启应用-->
<configuration status="warn" monitorInterval="5"><!--集中配置属性进行管理使用时通过:${name}--><properties><property name="LOG_HOME">D:/logs</property></properties><!-- 日志处理 --><Appenders><!-- 控制台输出 appender,SYSTEM_OUT输出黑色,SYSTEM_ERR输出红色 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /></Console><!-- 日志文件输出 appender --><File name="file" fileName="${LOG_HOME}/myfile.log"><!--<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />--><PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /></File><Async name="Async"><AppenderRef ref="file" /></Async></Appenders><!-- logger 定义 --><Loggers><!-- 使用 rootLogger 配置 日志级别 level="trace" --><Root level="trace"><!-- 指定日志使用的处理器 --><AppenderRef ref="Console" /><!-- 使用异步 appender --><AppenderRef ref="Async" /></Root></Loggers>
</configuration>

2、编写代码

package com.log;import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Slf4jTest {// 为了保证使用时,不需要每次都去创建logger 对象,我们声明静态常量public static final Logger LOGGER = LoggerFactory.getLogger(Slf4jTest.class);// 快速入门@Testpublic void testQuick(){// 日志输出LOGGER.error("error");LOGGER.warn("warning");LOGGER.info("info");    // 默认的日志级别信息LOGGER.debug("debug");LOGGER.trace("trace");  // 追踪信息}
}

3、运行结果截图,下面就是异步日志输出

img


2、AsyncLogger 方式【生产上用得多,因为性能高

AsyncLogger 才是log4j2 的重头戏,也是官方推荐的异步方式。它可以调用Logger.log 返回的更快。你可以有两种选择:全局异步和混合异步。

  • 全局异步就是,所有日志都异步的记录,在配置文件上不用做任何改动,只需要添加一个 log4j2.component.properties 配置到 resources;
Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

img

则此时,向控制台、文件都是异步方式日志输出

img


  • 混合异步就是,你可以在应用中同时使用同步日志和异步日志,这使得日志的配置方式更加灵活,按如下配置主要是添加截图部分即可:
<?xml version="1.0" encoding="UTF-8" ?>
<!--status="warn" 日志框架本身的输出日志级别,可以修改为debugmonitorInterval="5" 自动加载配置文件的间隔时间,不低于 5秒;生产环境中修改配置文件,是热更新,无需重启应用-->
<configuration status="debug" monitorInterval="5"><!--集中配置属性进行管理使用时通过:${name}--><properties><property name="LOG_HOME">D:/logs</property></properties><!-- 日志处理 --><Appenders><!-- 控制台输出 appender,SYSTEM_OUT输出黑色,SYSTEM_ERR输出红色 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n" /></Console><!-- 日志文件输出 appender --><File name="file" fileName="${LOG_HOME}/myfile.log"><!--<PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n" />--><PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /></File><Async name="Async"><AppenderRef ref="file" /></Async></Appenders><!-- logger 定义 --><Loggers><!-- 自定义 logger 对象includeLocation="false" 关闭日志记录的行号信息,开启的话会严重影响异步输出的性能additivity="false" 不再继承 rootlogger对象--><AsyncLogger name="com.log" level="trace" includeLocation="false" additivity="false"><AppenderRef ref="Console" /></AsyncLogger><!-- 使用 rootLogger 配置 日志级别 level="trace" --><Root level="trace"><!-- 指定日志使用的处理器 --><AppenderRef ref="Console" /><!-- 使用异步 appender --><AppenderRef ref="Async" /></Root></Loggers>
</configuration>

img

同时,AsyncLogger 混合异动日志输出需要将log4j2.component.properties 内容进行注释【因为这个是配置AsyncLogger全局异步日志输出】

img

如下配置:com.log 日志是异步的, root 日志是同步的。

使用异步日志需要注意的问题

  1. 如果使用异步日志,AsyncAppender、AsyncLogger 和全局日志,不要同时出现。性能会和AsyncAppender 一致,降至最低。
  2. 设置 includeLocation=false,打印位置信息会急剧降低异步日志的性能,比同步日志还要慢。

四、Log4j2 的性能

Log4j2 最牛的地方在于异步输出日志时的性能表现,Log4j2 在多线程的环境下吞吐量与 Log4j 和 Logback 的比较如下图。下图比较中 Log4j2 有三种模式:

  1. 全局使用异步模式;
  2. 部分Logger采用异步模式;
  3. 异步Appenderf。

可以看出在前两种模式下,Log4j2 的性能较之 Log4j 和Logback有很大的优势。

img

无垃圾记录

垃圾收集暂停是延迟峰值的常见原因,并且对于许多系统而言,花费大量精力来控制这些暂停。

许多日志库(包括以前版本的Log4j)在稳态日志记录期间分配临时对象,如日志事件对象,字符串,字符数组,字节数组等。这会对垃圾收集器造成压力并增加 GC 暂停发生的概率。

从版本2.6 开始,默认情况下 Log4j 以“无垃圾” 模式运行,其中重用对象和缓冲区,并且尽可能不分配临时对象。还有一个“低垃圾”模式,它不是完全无垃圾,但不使用ThreadLocal 字段。

Log4j 2.6 中的无垃圾日志记录部分通过重用ThreadLocal 字段中的对象来实现,部分通过在将文件转换为字节时重用缓冲区来实现。

使用Log4j 2.5:内存分配速度809 MB / 秒,141个无效集合。

img

Log4j 2.6没有分配临时对象:0(零)垃圾回收。

img

有两个单独的系统属性可用于手动控制Log4j 用于避免创建临时对象的机制:

  • log4j2.enableThreadlocals -如果"true"(非Web应用程序的默认值)对象存储在ThreadLocal 字段中并重新使用,否则将为每个日志事件创建新对象。
  • log4j2.enableDirectEncoders -如果将"true" (默认)日志事件转为文本,则将文本转换为字节而不创建临时对象。注意:由于共享缓冲区上的同步,在此模式下多线程应用程序的同步日志记录性能可能更差。

真诚的建议:如果您的应用程序是多线程的并且日志记录性能很重要,请考虑使用异步记录器。



http://chatgpt.dhexx.cn/article/cGIedohB.shtml

相关文章

Log4j2 简介

介绍 Log4j2是Log4j的升级版&#xff0c;与之前的版本Log4j 1.x相比、有重大的改进&#xff0c;修正了Logback固有的架构问题的同事&#xff0c;改进了许多Logback所具有的功能。 特性 一、API 分离 Log4j2将API与实现分离开来。开发人员现在可以很清楚的知道能够使用哪些没有兼…

数据分析方法08用户画像

用户画像 1、 概念 用户画像是指用户信息标签化&#xff0c;通过收集用户多维度的信息数据&#xff08;如人口统计属性&#xff0c;社会属性&#xff0c;行为偏好&#xff0c;消费习惯等&#xff09;&#xff0c;对其进行统计&#xff0c;分析&#xff0c;从而抽象出用户信息…

用户画像及其应用案例分享

一、用户画像基础概念 用户画像&#xff0c;即用户信息标签化&#xff0c;通过收集用户的社会属性、消费习惯、偏好特征等各个维度的数据&#xff0c;对用户特征属性进行刻画&#xff0c;并对这些特征进行分析、统计&#xff0c;挖掘潜在价值信息&#xff0c;从而抽象出用户的…

大数据分析--用户画像

从去年还在北京工作的时候就开始不断的听说&#xff0c;用户画像、用户画像&#xff0c;而且&#xff0c;有个项目&#xff0c;项目领导美其名曰&#xff1a;用户画像&#xff0c;这么长时间&#xff0c;也没有真正的思考过什么叫用户画像。前几天看到一篇关于这方面的文章&…

【数据分析】京东平台用户画像分析

1.用户信息标签 用户信息的收集包括用户基础要素、用户场景、行为偏好、心理个性、交际等多方面。 可以用静态标签、动态标签两大类来划分。 静态数据:用户相对稳定的信息&#xff0c;主要包括人口属性、商业属性等方面数据&#xff1b;这类信息果企业有真实信息则无需过多建…

用户画像解析

用户画像是大数据行业言必及之的时髦概念。现在我们运营谈及用户画像&#xff0c;它也是和精准营销、精细化运营直接钩挂的。这篇文章主要讲产品和运营角度的用户画像。 一、什么是用户画像 用户画像一点也不神秘&#xff0c;它是根据用户在互联网留下的种种数据&#xff0c;主…

用户画像分析总结

一、 什么是用户画像 用户画像是指根据用户的属性、用户偏好、生活习惯、用户行为等信息而抽象出来的标签化用户模型。通俗说就是给用户打标签&#xff0c;而标签是通过对用户信息分析而来的高度精炼的特征标识。通过打标签可以利用一些高度概括、容易理解的特征来描述用户&…

用户画像详解来了

导读&#xff1a;今天主要和大家分享明略对于用户画像的认识&#xff0c;包括如何理解用户画像&#xff0c;为什么需要用户用画像&#xff0c;以及明略在建设和应用用户画像过程中总结的方法论&#xff0c;让大家了解如何构建好的用户画像。 01 什么是用户画像 首先来看用户画像…

Python的import

Python里面的import语句用于导入一个已经写好的包或者模块 使得自己的程序里面可以使用导入的模块里面的函数、变量等 import name 导入numpy模块&#xff0c;里面有一个shape函数&#xff0c;要使用这个函数&#xff0c;numpy.shape()即可 但是不加numpy就不行&#xff0c;…

python-import this

优美胜于丑陋&#xff08;python 以编写优美的代码为目标&#xff09; 明了胜于晦涩&#xff08;优美的代码应该是明了的&#xff0c;命名规范&#xff0c;风格相似&#xff09; 简洁胜于复杂&#xff08;优美的代码应当是简洁的&#xff0c;不要有复杂的内部实现&#xff09…

import re

元字符 px* 可以匹配 p px px... px 可以匹配 px px... 但是不能匹配到p默认的匹配都是贪婪匹配 贪婪匹配就是一次匹配尽可能多的内容比如正则是 aoe 要匹配的字符串是 aoeeeeee 它可以匹配到aoeeeeee 但是如果正则是 aoe? 的话 它只能匹配到aoe ?放在 * {n,m}是取消贪婪匹…

1.连接服务器

1 使用服务器 参考文章&#xff1a;https://blog.csdn.net/longgeaisisi/article/details/78680180 双11通过团购入手阿里云服务器会得到一个提货券&#xff0c;同时收到短信提醒&#xff0c;跟着短信链接&#xff0c;进入阿里云控制台使用提货券。然后&#xff0c;会出现选项…

windows下连接服务器

一、windows下连接服务器 xhsell 是一个windows的软件 是用来连接远程服务器的 使用的是ssh协议 xftp 一个windows的软件 用来给服务器 上传或者下载文件的一个工具 ftp协议 shell环境 是运行命令的环境 shell脚本 用于给运维人员 来去做批量处理的 一个语言shell语言编写的一个…

linux之连接服务器

1. 背景 通常连接服务器使用ssh usernamehostname的方式&#xff0c;其中uername是用户名&#xff0c;一般为root等。hostname为ip地址。但是ip地址通常不容易记住&#xff0c;因此会将ip地址与一个名称相对应&#xff0c;然后直接使用名字来登陆服务器。 2. ip与name的映射 …

远程服务器怎么连接

利用windows自带远程桌面连接服务器&#xff0c;海星星 日付服务器 碉堡了 工具/原料 远程桌面 IP地址账号 方法/步骤 1 本商品直接使用WINDOWS自带的远程桌面连接就可以进行使用。 点开始——点运行&#xff08;或者直接用窗口键[win]R&#xff09;————在运行对话框输入m…

连接服务器

连接是什么意思 创建套接字之后&#xff0c;应用程序&#xff08;浏览器&#xff09;就会调用connect&#xff0c;随后协议栈会将本地的套接字与服务器的套接字进行连接。话说&#xff0c;以太网的网线都是一直连接的状态&#xff0c;我们并不需要来回插拔网线&#xff0c;那么…

创建链接服务器

GPS平台、网站建设、软件开发、系统运维&#xff0c;找森大网络科技&#xff01; https://cnsendnet.taobao.com 来自森大科技官方博客 http://www.cnsendblog.com/index.php/?p1862 给SQL Server创建连接服务器 一、 可视化界面操作 1.点击“新建连接服务器” 2.“常规”选…

如何连接云服务器

** - 本篇文章是&#xff1a;教跟我一样一开始不会连接远程云服务器的小白们 ** 首先你已经有一个公网ip&#xff08;在阿里云/腾讯云/等等许多地方都可以租到&#xff09; 注&#xff1a;作者本人申请了一个试用的华为云2008Windows64bit的服务器 以下教你如何一步步连接…

连接到服务器(1)

问题一&#xff08;未找到或无法访问服务器&#xff09; 标题: 连接到服务器 ------------------------------ 无法连接到 TOM-PC。 ------------------------------ 其他信息: 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证…

如何连接服务器

1&#xff1a; 先进入 C:/uers/<username>/.ssh/config 2:添加 Host <IP> HostName <IP> User <username> 3进入vscode 设置 搜索 remote 然后连接