SpringBoot集成slf4j日志配置

news2024/10/5 15:36:03

目录

前言

1、slf4j概述

2、pom.xml的日志依赖

3、application.yml的日志配置

4、logback.xml配置文件定义

5、logback.xml配置文件解析

5.1 定义日志的存储路径

5.2 定义日志的输出格式

5.3 定义控制台输出

5.4 定义日志相关参数

5.5 定义日志的输出级别

6、测试日志输出

7、小结

前言

日志,作为一个应用系统的重要部分,然而并不会在项目预研或需求设计阶段就作为一个功能模块单独规划设计,但这丝毫不影响它在任何一个系统中的重要的地位。

为了保证服务的高可用,及时发现问题,迅速解决问题等诉求,所以生产环境一旦出现问题,预警系统就会通过邮件、短信甚至电话的方式实施多维轰炸模式,确保相关负责人不错过每一个可能的bug。

预警系统判断疑似bug大部分源于日志。比如某个微服务接口由于各种原因导致频繁调用出错,此时调用端会捕获这样的异常并打印ERROR级别的日志,当该错误日志达到一定次数出现的时候,就会触发报警。

其次,在以往项目开发过程中,我们往往习惯性使用System.out.println()这个常用的打印输出语句来显示断点信息或业务运行对象信息或控制台日志记录,其实大量的使用System.out.println()在一定程度上会增加资源的消耗。Java日志框架众多,常用的有java.util.logging,log4j,logback,commons-logging等等。而且SpringBoot 提供了一套日志系统,logback是最优的选择。因此本文根据实际项目中使用slf4j 的logback来输出日志,效率很高。

日志的重要性,不言而喻。

OK,接下来,本文主要总结一下项目中目前使用的SpringBoot集成slf4j日志配置。

1、slf4j概述

slf4j,即(Simple Logging Facade for Java,简单门面日志)。它是对所有日志框架制定的一种规范、标准、接口,并不是一个框架的具体的实现,它只服务于各种各样的日志系统。

slf4j提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过绑定具体的日志系统来实现。在项目中使用了slf4j记录日志,并且绑定了log4j(pom.xml中配置了相应的jar包依赖),则日志会以log4j的风格输出;后期需要改为以logback的风格输出日志,只需要将jar包log4j替换成logback即可,根本不需要修改日志文件的代码。

首先看下日志打印,如下,在启动类中引入Logger日志记录:

@SpringBootApplication
public class SpringbootSlf4jApplication {
 
    private static final Logger logger = LoggerFactory.getLogger(SpringbootSlf4jApplication.class);
 
    public static void main(String[] args) {
        logger.info("===============项目启动了===============");
        SpringApplication app = new SpringApplication(SpringbootSlf4jApplication.class);
        app.run(args);
        logger.info("===============启动成功了===============");
    }
}

日志信息: 

2020-03-21 11:28:18.017 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - ===============项目启动了===============
2020-03-21 11:28:18.447 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - Starting SpringbootSlf4jApplication on DESKTOP-V8RSTKO with PID 17476
2020-03-21 11:28:18.447 [main] DEBUG com.hl.magic.slf4j.SpringbootSlf4jApplication - Running with Spring Boot v2.1.8.RELEASE, Spring v5.1.9.RELEASE
2020-03-21 11:28:18.447 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - No active profile set, falling back to default profiles: default
2020-03-21 11:28:19.077 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
2020-03-21 11:28:19.087 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
2020-03-21 11:28:19.097 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
2020-03-21 11:28:19.097 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.24]
2020-03-21 11:28:19.157 [main] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2020-03-21 11:28:19.157 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 680 ms
2020-03-21 11:28:19.287 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2020-03-21 11:28:19.387 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
2020-03-21 11:28:19.397 [main] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-03-21 11:28:19.397 [main] INFO  org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2020-03-21 11:28:19.407 [main] INFO  org.springframework.web.servlet.DispatcherServlet - Completed initialization in 10 ms
2020-03-21 11:28:19.410 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
2020-03-21 11:28:19.410 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - Started SpringbootSlf4jApplication in 1.323 seconds (JVM running for 2.024)
2020-03-21 11:28:19.410 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - ===============启动成功了===============

getLogger(xxxxxxx.class);这个方法将当前所在的类作为入参传递,输出日志就会显示对应的xxx类名。这样声明的好处就是方便定位日志,准确编写class信息能够提供快速定位日志的效率。

然鹅,SpringBoot内部虽然提供了slf4j,但是日志记录是需要根据项目实地需要进行配置后,才能发挥它的最大功效。OK,接下来一起来了解下SpringBoot项目集成slf4j日志的配置。 

2、pom.xml的日志依赖

pom.xml中日志依赖配置如下:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.30</version>
</dependency>

3、application.yml的日志配置

SpringBoot框架内部已经集成slf4j,在使用时,根据项目实地需要,还是须对slf4j进行指定配置。

application.yml文件是SpringBoot的一个及其重要、核心的配置文件。yml 文件的层次感较强且直观,但对格式要求比较高,英文冒号后面必须要有一个空格,如果换行配置子项,须定格输入两个空格后再进行配置,否则项目估计无法启动,而且也不报错。本文测试项目的application.yml中日志配置如下:

logging:
  config: /HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/src/main/resources/logback.xml
  level:
    com.hl.magic: trace

注意:

【1】这里logback.xml的配置不同于一般日志配置;

因为在单独的一个SpringBoot工程中,配置config标签处为:locbak.xml即可;

这里在SpringBoot工程的一个子Module中集成日志配置,因此config标签处,设置为绝对路径。

【2】logging.config是用来指定项目启动的时候,读取哪个配置文件,这里指定的是日志配置文件,即子module项目根路径下的 logback.xml文件,该文件是日志的主要配置信息。

【3】level用来配置指定包的路径下应用程序的日志记录,及其日志级别。

logging.level用来指定具体的包中应用程序日志的输出级别。上面的配置表示com.hl.magic包下的所有日志输出级别为 trace,会将操作数据库的 sql 打印出来,开发时设置成 trace 方便定位问题,在生产环境上,将这个日志级别再设置成 error 级别即可。

日志常用的五个级别,根据严重程度由低到高,依次为:debug(调试 ) < info(消息) < warn(警告) < error(错误) < fatal(严重错误)。通常可以根据实际所需要的颗粒度的大小选择其中的几个,当前常用debug,info,warn,error4个级别。

4、logback.xml配置文件定义

在引入日志配置后,需要制定日志的配置文件内容,这样系统运行后,根据定制化需求才能输出我们所需的指定日志记录信息。

本文测试用例的日志配置内容logback.xml文件,详细内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <property name="LOG_HOME" value="/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>
    <!-- 定义日志格式  -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
    <!-- 控制台输出 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/SpringBoot-Slf4j_%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
 
    <!-- 日志输出级别 -->
    <logger name="org.springframework" level="INFO"/>
    <logger name="com.hl.magic" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

 有上边可以看出,我们可以轻松的在logback.xml中定义日志输出的格式、路径、控制台输出格式、文件大小、保存时长等内容。接下来,就这些内容进行分析。

5、logback.xml配置文件解析

5.1 定义日志的存储路径

logback.xml文件中日志存储路径定义:

<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<property name="LOG_HOME" value="/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>

分析:

首先,定义日志的名称:LOG_HOME;

其次,设置输出value定义为日志的存储路径,日志都会存储在该路径下。

注意:这里勿在logback文件中使用相对路径,不管是 windows 系统还是 Linux 系统,日志存储的路径必须要是绝对路径。

5.2 定义日志的输出格式
<!-- 定义日志格式  -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>

分析:

 首先,定义日志格式的名称:LOG_PATTERN

其次,设置日志的具体格式value。

"%d" 表示日期(也可以使用"%date");

"%-5level" 表示级别从左显示5个字符宽度;

"%thread" 表示线程名;

"%-30.30logger{30}"  表示如果logger的名称小于30,就“-”指定左对齐;如果其名称长于30字符,就从左边较远输出的字符截掉,保持logger的名字长度最终限制为30个字符;

"%msg" 表示日志消息,`%n` 是换行符。

5.3 定义控制台输出
<!-- 定义控制台输出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!-- 变量引入  -->
        <pattern>${LOG_PATTERN}</pattern>
            
        <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
        <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
    </encoder>
</appender>

分析:

使用 <appender>标签设置控制台输出(`class="ch.qos.logback.core.ConsoleAppender"`)的配置,定义为 “CONSOLE”。使用引入变量的方式: <pattern>${LOG_PATTERN}</pattern>引进来即可。引入上面定义好的输出格式(LOG_PATTERN)来输出

这里,也可以直接配置格式化输出结果的方式,不过体力工作。

5.4 定义日志相关参数

在<appender>标签内定义一个名为 “FILE” 的文件参数配置。主要是配置日志文件的输出文件名、日志文件保留时间、日志文件保存的路径和日志的输出格式、及单个日志文件存储的大小。

<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件输出的文件名-->
        <FileNamePattern>${LOG_HOME}</FileNamePattern>
        <!--日志文件保留天数-->
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
         <!-- 变量引入  -->
         <pattern>${LOG_PATTERN}</pattern>
            
         <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
         <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> -->
    </encoder>
    <!--日志文件最大的存储-->
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MB</MaxFileSize>
    </triggeringPolicy>
</appender>

分析:

 这里,根据前面配置的日志变量,引入到配置日志文件的输出文件名、日志文件保留时间、日志文件保存的路径和日志的输出格式、及单个日志文件存储的大小的各个标签项即可。

5.5 定义日志的输出级别

在完成前边的准备工作后,最后来定义一下日志的输出级别:

<!-- 日志输出级别 -->
<logger name="org.springframework" level="ERROR"/>
<logger name="com.hl.magic" level="ERROR"/>
<root level="ERROR">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
</root>

分析:

在<logger>标签中来项目默认的日志输出级别,这里定义级别为ERROR(用在生产环境中),然后针对ERROR级别的日志,使用<root>引用上面定义好的控制台日志输出和日志文件的参数。这样 logback.xml 文件中的配置就设置完了。

注意:

<logger>标签并不是只能添加一个,我们还可以指定项目特定包路径的日志输出级别。

本文测试类配置日志输出级别为:DEBUG,使用最低日志输出级别,确保后边测试时能够打印出所有测试项。如果需要改变日志级别就在上面配置内容修改即可。

6、测试日志输出

在程序中,一般使用 Logger(注意引jar包为slf4j) 对象来打印出一些日志信息,可以指定打印出的日志级别,也支持占位符。

定义一个测试类:LoggerItemController.java

/**
 * 日志输出测试的controller
 */
@RestController
@RequestMapping("/loggerItem")
public class LoggerItemController {
 
    private static final Logger logger = LoggerFactory.getLogger(LoggerItemController.class);
 
    @GetMapping("/logInfo")
    public ResponseMessage logTest(){
 
        logger.debug("=====>测试日志debug级别打印<====");
        logger.info("=====>测试日志info级别打印<=====");
        logger.error("=====>测试日志error级别打印<====");
        logger.warn("=====>测试日志warn级别打印<=====");
 
        // 使用占位符打印出一些参数信息
        String csdn = "https://blog.csdn.net/qq_27706119";
        String git = "https://github.com/JohnnyHL";
        logger.info("======>AndOne丶的CSDN博客:{};AndOne丶的GitHub地址:{};", csdn, git);
 
        return new ResponseMessage(ResponseStatus.SUCCESS.getStatus(),ResponseStatus.SUCCESS.getMessage());
    }
}

先启动项目,浏览器访问地址:127.0.0.1:8080/loggerItem/logInfo

查看控制台打印信息:

=====>测试日志debug级别打印<====
=====>测试日志info级别打印<=====
=====>测试日志error级别打印<====
=====>测试日志warn级别打印<=====
======>AndOne丶的CSDN博客:https://blog.csdn.net/qq_27706119;AndOne丶的GitHub地址:https://github.com/JohnnyHL;

日志的输出级别中,DEBUG为最低级别,这样能打印出全部信息。如果提高日志输出级别,比如选择INFO。则DEBUG 这条记录将不会被打印出来,这个大家可自行测试即可。同时,查看下前边配置的日志存储路径:“/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log”目录,该目录下记录了项目启动,以及后面生成的所有日志记录。在日常开发过程中,项目部署后,可通过查看日志文件来定位问题。

7、小结

 本文首先简述slf4j,详细地分析了logback.xml 文件中对日志相关信息的配置;然后对SpringBoot集成slf4j 输出日志做了详细的分析说明;最后,根据日志配置,利用一个demo进行测试分析。在实地项目中,日志都是排查问题的过程中非常重要的资料。

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

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

相关文章

mysql中 redo日志(下)

大家好。上篇文章我们介绍了什么是redo日志以及redo日志的写入过程。建议没看过上篇文章的同学先看一下上一篇文章&#xff0c;今天我们继续来说一说redo日志。 一、redo日志文件 1. redo日志刷盘时机 我们知道mtr运行过程中产生的一组redo日志在mtr结束时会被复制到log buf…

利用AI大模型,将任何文本语料转化为知识图谱,可本地运行!

几个月前&#xff0c;基于知识的问答&#xff08;KBQA&#xff09;还是一个新奇事物。 现在&#xff0c;对于任何 AI 爱好者来说&#xff0c;带检索增强生成&#xff08;RAG&#xff09;的 KBQA 就像小菜一碟。看到自然语言处理&#xff08;NLP&#xff09;的可能性领域由于大…

JVM性能优化案例:优化垃圾回收器的年轻代和老年代占比

JVM性能优化案例&#xff1a;优化垃圾回收器的年轻代和老年代占比 我们有一款在线交易系统&#xff0c;要求低延迟和高吞吐量。系统运行在Ubuntu服务器上&#xff0c;使用OpenJDK 11&#xff0c;并启用了G1垃圾回收器。以下是系统的基本配置和GC日志信息&#xff1a; 操作系统…

学习笔记丨嵌入式BI分析的12个关键功能

编者注&#xff1a;以下内容节选编译自嵌入式分析厂商Qrvey发表的《What is Embedded Analytics?》&#xff08;什么是嵌入式分析&#xff09;一文&#xff0c;作者为Qrvey产品市场主管Brian Dreyer。 什么是嵌入式分析&#xff1f; 嵌入式分析是指能够将数据分析的特性和功…

React+TS前台项目实战(七)-- 全局常用组件Select封装

文章目录 前言Select组件1. 功能分析2. 代码详细注释说明3. 使用方式4. 效果展示&#xff08;1&#xff09;鼠标移入效果&#xff08;2&#xff09;下拉框打开效果&#xff08;3&#xff09;回调输出 总结 前言 今天这篇主要讲全局select组件封装&#xff0c;可根据UI设计师要…

java1.8运行arthas-boot.jar运行报错解决

报错内容 输入java -jar arthas-boot.jar&#xff0c;后报错。 [INFO] JAVA_HOME: D:\developing\jdk\jre1.8 [INFO] arthas-boot version: 3.7.2 [INFO] Can not find java process. Try to run jps command lists the instrumented Java HotSpot VMs on the target system.…

资源付费系统小程序APP公众号h5源码

&#x1f510; 揭秘“资源付费系统”&#xff1a;知识、技能与价值的交汇点 &#x1f48e; &#x1f31f; 引言&#xff1a;为何资源需要付费&#xff1f; 在数字化时代&#xff0c;我们周围充斥着大量的信息。但并非所有信息都具有同等的价值。其中&#xff0c;那些经过精心…

项目五串行通信系统 任务5-3温度信息上传

任务描述&#xff1a;DS18B20测量温度&#xff0c;单片机采集温度数据转换显示代码&#xff0c;并通过串行口发送到上位机显示。 底层文件&#xff1a; /********************************************* ds18b20底层函数:能完成一次温度数据读取 ***************************…

算法课程笔记——线段树动态开点

算法课程笔记——线段树动态开点 、

大模型高考数学测评结果,国内AI大模型成绩超GPT-4o!

每年高考都是备受全社会关注的一件大事&#xff0c;而今年略有不同&#xff0c;因为除了鱼跃龙门的高三学子们&#xff0c;还多了许多陪他们一同参加考试的 AI 大模型。 在所有的考试科目中&#xff0c;数学显然一直都是最难的那一门&#xff0c;不论是对考生还是对大模型。因…

设备管理系统——设备台账管理

设备管理系统中的设备台账管理是一项关键的功能&#xff0c;它涵盖了设备从购入、使用、维护到报废的全生命周期管理。以下是设备台账管理在设备管理系统中的详细功能和重要性&#xff1a; 一、设备台账管理的基本功能 设备信息录入&#xff1a; 录入设备的基本信息&#xff0…

B端系统的颜值问题:成也框架,败也框架!

B端UI框架和前端框架的出现&#xff0c;让系统的搭建就像堆积木一样&#xff0c;十分的容易了。这也一下子把程序员的设计和审美水平拔高到了UI框架能够达到的高度。伴随而来的则是系统的堆砌、同质化、糟糕的体验&#xff0c;以及各种违和的组件被生搬硬套的绑定在一块&#x…

传统工厂该如何做数字化转型?

传统工厂实现数字化转型需多方面着手&#xff0c;包括树立战略意识、明确目标规划&#xff0c;加强信息化建设、提升数据能力&#xff0c;培养引进人才、推动技术创新&#xff0c;优化业务流程、提高生产效率与质量管控&#xff0c;加强协同合作、实现产业链整合&#xff0c;建…

男士内裤买便宜还是贵的?2024年高性价比男士内裤汇总分享

男生内裤&#xff0c;作为贴身衣物&#xff0c;承载着男性的私密与舒适。然而&#xff0c;许多男士的内裤状况却让人大跌眼镜&#xff1a;穿到变形、腰部松垮无弹性&#xff0c;屁股后面甚至出现破洞&#xff0c;这样的景象已然屡见不鲜。更有些男士的内裤&#xff0c;中间一个…

lnmp的介绍与源码部署以及 |什么是正向、反向、透明代理 | 常见的集群有哪些

lnmp 文章目录 lnmp1.LNMP是什么2. lnmp简介3.系统特点4.优点5.lnmp部署5.1 nginx安装5.2 mysql安装5.3 php安装5.4配置nginx服务处理php 6.扩展知识点1.什么是集群2.常见的集群有哪些集群的分类1、高可用集群2、负载均衡集群3、分布式计算集群4、高性能集群(High Performance …

你为什么不相信 LLM 模型评测:深入评测 LLM 接口

我相信你已经看过很多机构发布的 LLM&#xff08;大语言模型&#xff09; 的模型效果质量的评测文章了。 其实呢&#xff0c;大家看了很多自称权威&#xff0c;或者不怎么权威的评测文章&#xff0c;基本上也就看看就完了&#xff0c;很少有人真的相信这些测试结果。 为什么你…

基于Simufact Welding定向沉积增材仿真的几何变形补偿

在DED&#xff08;Directed energy deposition定向能量沉积&#xff0c;下述简称DED&#xff09;增材工艺过程中&#xff0c;由于零部件的重复加热&#xff0c;极易产生部件的变形问题。借助专业的金属定向能量沉积仿真软件Simufact Welding&#xff0c;能够对目标件进行瞬态数…

线稳源极跟随 线性电源前端降压

功率MOSFET线性电源涉及跟随.ms14 根本原理是Vgs对Id的控制&#xff0c;Vgs越大&#xff0c;Id越大&#xff0c;反之亦然。 观察转移特性曲线&#xff0c;结合接线图可知&#xff0c;电路稳定后&#xff0c;如果负载电阻增大&#xff0c;则Vsgnd增大&#xff0c;由于Vggnd有稳…

负压式水帘风机和一体式水帘风机的特点

负压式水帘风机和一体式水帘风机各有其独特的特点&#xff0c;以下是它们的特点归纳&#xff1a; 负压式水帘风机特点&#xff1a; 高效节能&#xff1a; 通过水帘与负压风机的配合&#xff0c;模拟自然界的蒸发降温过程&#xff0c;耗电量仅为传统空调的十分之一&#xff0c…

Liinux:进程程序替换

替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用e…