springboot使用logback自定义日志

前言

1、末尾有完整配置文件

2、日志分为五个等级,按照优先级的高低可以分为:

TRANCE < DEBUG < INFO < WARN < ERROR

springboot默认是INFO,因此低于INFOTRACEDEBUG都不会输出。

可以在propertiesyaml配置文件中修改日志级别:

logging:
  level:
    root: debug

这里的root可以换成包名,精细控制不同包的日志输出级别,比如:

logging:
  level:
    com.example.controller: debug
    com.example.mapper: error

3、其次,logback的日志分为控制台日志和文件日志。

控制台日志:也就是我们IDE运行项目时,控制台打印的信息。

文件日志:项目运行时,将运行信息写入到指定文件。需要在springboot配置文件或logback配置文件中指定日志文件的位置。

引入依赖

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

解释:按理来讲需要引入的是spring-boot-starter-logging依赖,但是spring-boot-starter-web间接依赖于spring-boot-starter-logging,所以我们只需要引入spring-boot-starter-web即可。

使用logback

logback会自动寻找classpath根部下面的logback.xml,所以我们只需要在resource目录下创建logback.xml文件,就可以在程序启动时,自动加载自定义日志的配置文件。

如果不想叫logback.xml,想起一个有个性的名字,比如cxkLogback.xml,那么需要在propertiesyaml配置文件指定logback文件路径:

logging:
  config: classpath:cxkLogback.xml

如果想验证一下,可以将下方概览中的配置文件复制到自己的项目中运行一下,观察控制台的日志输出格式。

配置文件概览

可以简单先看一个配置文件的案例

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当配置文件修改后,将会重新载入。
    scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。
    debug:为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 定义一个名为STDOUT的控制台输出Appender -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
        	<!-- 输出格式 -->
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 定义一个名为FILE的文件输出Appender -->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <!-- 设置日志文件的存放路径和文件名,可根据实际情况修改 -->
        <file>logs/app.log</file>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 配置根日志记录器,设置日志级别为DEBUG,并将日志输出到STDOUT和FILE这两个Appender -->
    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>

</configuration>

这个文件主要定义了两个Appender,分别输出日志到控制台和文件中。

其次定义root目录的日志级别,并将两个Appender配置到root目录下,进行日志输出。

这里的root标签里面定义了level,有没有感觉在哪里见过这个东西?

没错,上文讲到,我们可以在propertiesyaml配置文件中修改日志级别,在springboot配置文件中的操作,和这里的操作是等价的。那么按照同样的道理,这里的root也可以细化成不同的包,配置不同的levelAppender。这里只是引出这个概念,具体的内容放在下文。

配置项详解

<configuration>:logback配置的根标签。它包含三个属性:scanscanPerioddebug

  • scan:当配置文件修改后,将会重新载入。值为truefalse
  • scanPeriod:时间间隔。每隔一段时间检测一次配置文件是否被修改。值可以是6012 second,数字是自定义的,不是非要填6012,如果没有给出时间单位,默认单位是毫秒。当scantrue时,此属性生效。
  • debug:是否打印logback内部日志信息,实时查看logback运行状态。值为truefalse(默认)。

<Appender>:可以理解成负责写日志的工具人。一个Appender就是一个工具人。

<logger> :设置某一个包或具体的类的日志打印级别,以及指定的Appender(分配打工人)。

<root>:根logger,也是logger的一种,且只有一个level属性。

contextName:每个logger都关联到logger上下文,默认上下文名称为default。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录。

property:用来定义变量值的标签,property标签有两个属性,namevalue;其中name的值是变量的名称,value的值时变量定义的值。通过property定义的值会被插入到logger上下文中。定义变量后,可以使“${name}”来使用变量。

Appender的种类:

  • ConsoleAppender:控制台日志。
  • FileAppender:文件日志。
  • RollingFileAppender:滚动文件日志。会在日志文件达到某种条件后,创建新的日志文件继续写入日志。常见的条件是文件的大小,比如设置每个文件大小为2KB时,创建新的文件继续写入,文件名大致为xxx1.log,xxx2.log。

输出格式详解

举个例子:%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n

%level:日志级别。

%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}:时间。

[%thread]:当前线程。

%-4relative:从程序启动到当前日志记录事件所经过的相对时间。-表示左对齐,4表示4个字符宽度。

%logger{40}:输出日志记录器名称的占位符,其中40是一个可选的参数,用于指定输出的日志记录器名称的最大长度。如果不指定{40}这样的参数,默认会输出完整的日志记录器名称。

%msg:日志消息主体。

%n:换行。

%file:文件名。

%line:行号。

配置文件示例

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当配置文件修改后,将会重新载入。
    scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。
    debug:为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <!-- 日志文件路径,如果spring配置文件没有对应值,使用默认值 -->
    <springProperty scope="context" name="springFilePath" source="log.path" defaultValue="src/main/resources/log"/>

    <!-- 将日志输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%level | %d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai} | [%thread] | %-4relative | %logger{40}| -- %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 将日志输出到文件 -->
    <!--
        使用轮转日志:日志文件超出一定大小后,会新建一个文件(Rolling)
    -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 设置文件路径 -->
        <file>${springFilePath}/spring.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 基于时间和大小的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <fileNamePattern>${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 单个日志文件最大体积,超出最大值,会新建一个日志文件-->
            <maxFileSize>200MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>60</maxHistory>
            <!-- 所有日志文件的总体积限制 -->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- root节点时必选节点,用来指定最基础的日志输出级别,只有一个level属性 -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

</configuration>

给日志配置颜色

方式一、使用官方默认配置

只需要在xml配置文件里引入配置文件即可。

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

什么?你问我这个文件去哪里找?根据resource里面的路径,去lib目录的springboot依赖中找。

方式二、自定义颜色配置

使用形如%clr(){red}来给日志标签配置颜色。

要使用%clr,有两种方式:

第一种是引入方式一的默认配置文件,在该文件里面就帮我们引入了%clr

第二种方式就是手动引入%clr,可以参考一下defaults.xml

<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

%clr支持的颜色:blue、cyan、faint、green、magenta、red、yellow

faint:淡色(控制台默认颜色)

magenta:品红色

这里贴一下我的pattern

%level | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n

那这个时候你就会发现了,这样自定义的话,我的level怎么没有颜色啊。

不要担心,有解决办法的。

这里提供两种解决办法:

第一种可以更改一下logback中,%clr对于level的判断,针对不同level显示不同颜色,但是这个我还不会,所以自行探索。

第二种要用的是%highlight高亮。

使用%highlight给level配置颜色

第一步、新建一个高亮颜色配置类。

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter;
import ch.qos.logback.classic.spi.ILoggingEvent;

import static ch.qos.logback.core.pattern.color.ANSIConstants.*;
import static ch.qos.logback.core.pattern.color.ANSIConstants.DEFAULT_FG;

/**
 * 自定义 %highlight,实现不同日志level不同颜色
 */
public class LevelHighLightColorConfig extends HighlightingCompositeConverter {
    // 这里用的版本是springboot 2.6.13
    // 如果你发现父类中的方法不是getForegroundColorCode,可能是版本差异造成的。
    // 那么需要你对着父类ctrl+左键点击,看看父类是怎么实现的
    // 然后照猫画虎继续修改,核心逻辑就是判断然后返回不同的颜色。
    // 因为作者跟着AI配置的时候就遇到这种情况,也是模仿父类进行修改的。
    @Override
    protected String getForegroundColorCode(ILoggingEvent event) {
        Level level = event.getLevel();
        switch (level.toInt()) {
            case Level.ERROR_INT:
                return RED_FG;
            case Level.WARN_INT:
                return YELLOW_FG;
            case Level.INFO_INT:
                return GREEN_FG;
            default:
                return DEFAULT_FG;
        }
    }
}

第二步、在logback.xml配置文件中引入我们的%highlight

conversionWord的值固定为highlightconverterClass的值为我们上一步写的配置类。

<conversionRule conversionWord="highlight"
                    converterClass="com.yexiao.userCenter.config.LevelHighLightColorConfig" />

第三步、编写pattern

<pattern>%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n</pattern>

完整配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
    scan:当配置文件修改后,将会重新载入。
    scanPeriod:设置检测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。
    debug:为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<configuration scan="true" scanPeriod="60 seconds" debug="false">

    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <conversionRule conversionWord="highlight"
                    converterClass="com.yexiao.userCenter.config.LevelHighLightColorConfig" />

    <!-- 日志文件路径,如果spring配置文件没有对应值,使用默认值 -->
    <springProperty scope="context" name="springFilePath" source="log.path" defaultValue="src/main/resources/log"/>

    <!-- 将日志输出到控制台 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%highlight(%level) | %clr(%d{yyyy-MM-dd HH:mm:ss,Asia/Shanghai}){magenta} | [%thread] | %-4relative | %clr(%logger{40}){magenta}| -- %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 将日志输出到文件 -->
    <!--
        使用轮转日志:日志文件超出一定大小后,会新建一个文件(Rolling)
    -->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 设置文件路径 -->
        <file>${springFilePath}/spring.log</file>
        <!-- 基于时间和大小的滚动策略 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- 日志文件输出的文件名 -->
            <fileNamePattern>${springFilePath}/spring.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 单个日志文件最大体积,超出最大值,会新建一个日志文件-->
            <maxFileSize>200MB</maxFileSize>
            <!-- 日志文件保留天数 -->
            <maxHistory>60</maxHistory>
            <!-- 所有日志文件的总体积限制 -->
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %thread -- %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
    </appender>

    <!-- root节点时必选节点,用来指定最基础的日志输出级别,只有一个level属性 -->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

</configuration>1

Tips

1、文件路径配置问题

文件路径有两种方式配置,分别是filepath,或者在xml文件中配置。

注:file和path二者不能同时使用,如若同时使用,则只有logging.file生效
logging.file=文件名
logging.path=日志文件路径
 
logging.level.包名=指定包下的日志级别
logging.pattern.console=日志打印规则
  • logging.file,设置文件,可以是绝对路径,也可以是相对路径。如:logging.file=my.log
  • logging.path,设置目录,会在该目录下创建spring.log文件,并写入日志内容,如:logging.path=/var/log

注:二者不能同时使用,如若同时使用,则只有logging.file生效,可以看到这种方式配置简单,但是能实现的功能也非常有限,如果想要更复杂的需求,就需要下面的定制化配置了。

2、使用%clr添加颜色,启动报错

完整报错如下:

Exception in thread "main" java.lang.IllegalStateException: Logback configuration error detected: 
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - There is no conversion class registered for composite conversion word [clr]
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - Failed to create converter for [%clr] keyword
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - There is no conversion class registered for composite conversion word [clr]
ERROR in ch.qos.logback.core.pattern.parser.Compiler@7a362b6b - Failed to create converter for [%clr] keyword
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.loadConfiguration(LogbackLoggingSystem.java:166)
	at org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(AbstractLoggingSystem.java:82)
	at org.springframework.boot.logging.AbstractLoggingSystem.initialize(AbstractLoggingSystem.java:60)
	at org.springframework.boot.logging.logback.LogbackLoggingSystem.initialize(LogbackLoggingSystem.java:114)
	at org.springframework.boot.context.logging.LoggingApplicationListener.initializeSystem(LoggingApplicationListener.java:264)
	at org.springframework.boot.context.logging.LoggingApplicationListener.initialize(LoggingApplicationListener.java:237)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEnvironmentPreparedEvent(LoggingApplicationListener.java:200)
	at org.springframework.boot.context.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:173)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
	at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:127)
	at org.springframework.boot.context.event.EventPublishingRunListener.environmentPrepared(EventPublishingRunListener.java:74)
	at org.springframework.boot.SpringApplicationRunListeners.environmentPrepared(SpringApplicationRunListeners.java:54)
	at org.springframework.boot.SpringApplication.prepareEnvironment(SpringApplication.java:358)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:317)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
	at com.kaka.jtest.springboot.Application.main(Application.java:24)

解决办法:

没有引入%clr,需要引入默认的配置文件

<include resource="org/springframework/boot/logging/logback/defaults.xml"/>

或手动引入%clr

<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
3、不要在日志文件里面使用颜色输出

使用颜色输出会将颜色转换成ANSI码,不会有颜色,可读性较差。

参考链接

【1】SpringBoot+logback优雅的配置日志

【2】logback官方配置文档

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用JMeter给要登录的操作做压力测试

压力测试的http请求路径如下图 应当添加http Header Manager&#xff0c;设置登录凭证

【DeepSeek 行业赋能】从金融到医疗:探索 DeepSeek 在垂直领域的无限潜力

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

【CSP/信奥赛通关课(一):C++语法基础】

CSP/信奥赛通关课&#xff08;一&#xff09;&#xff1a;C语法基础 课程简介&#xff1a; 通过六大模块&#xff08;基础入门、顺序结构、选择结构、循环结构、数组、函数&#xff09;&#xff0c;讲解CSP/信奥赛C语法基础&#xff0c;以模块化思想让学生入门C代码编程学习。 …

Web 自动化测试提速利器:Aqua 的 Web Inspector (检查器)使用详解

Web 自动化测试提速利器&#xff1a;Aqua 的 Web Inspector &#xff08;检查器&#xff09;使用详解 前言简介一、安装二、Web Inspector 的使用2.1 获取元素定位器&#xff08;Locators&#xff09;2.2 将定位器添加到代码2.3 验证定位器2.4 处理 Frames (框架) 总结 前言 Je…

IDEA中查询Maven项目的依赖树

在Maven项目中&#xff0c;查看项目的依赖树是一个常见的需求&#xff0c;特别是当你需要了解项目中直接或间接依赖了哪些库及其版本时。你可以通过命令行使用Maven的dependency:tree插件来做到这一点。这个命令会列出项目中所有依赖的树状结构。 打开idea项目的终端&#xff…

大数据技术之HBase操作归纳

HBase基本命令总结表(实际操作方式) 进入Hbase&#xff1a;hbase shell 方式一&#xff1a;命令行窗口来操作HBase 1.通用性命令 version 版本信息 status 查看集群当前状态 whoami 查看登入者身份 help 帮助2.HBase DDL操作(对象级操作) 2.1、namespace命名空间(相当…

Java 大视界 -- 国际竞争与合作:Java 大数据在全球市场的机遇与挑战(94)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

1.16作业

1 进注册界面&#xff0c;第一次以为抓包选把isadmin ture了就好 第二次尝试&#xff0c;勾选is admin&#xff0c;有需要invitecode&#xff08;经典&#xff09; 2 p r**5 r**4 - r**3 r**2 - r 2023 q r**5 - r**4 r**3 - r**2 r 2023 n 25066797992811602609904…

MybatisPlus教程-从入门到进阶

前言 首先它是国产的&#xff0c;所以直接用官网的简介。 简介 MyBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 特性 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有…

算法1-4 数楼梯

题目描述 楼梯有 N 阶&#xff0c;上楼可以一步上一阶&#xff0c;也可以一步上二阶。 编一个程序&#xff0c;计算共有多少种不同的走法。 输入格式 一个数字&#xff0c;楼梯数。 输出格式 输出走的方式总数。 输入输出样例 输入 #1 4 输出 #1 5 说明/提示 对于…

DigitalOcean H200 GPU裸机服务器上线!可更好支持DeepSeek满血版

在 DigitalOcean&#xff0c;我们始终致力于为开发者、初创企业和人工智能驱动型公司提供更便捷的高性能计算资源&#xff0c;助力其业务扩展。今日&#xff0c;DigitalOcean 隆重推出基于 NVIDIA HGX H200 AI 超级计算平台的裸机服务器&#xff0c;专为高性能AI工作负载而生。…

企业组网IP规划与先关协议分析

目录 一、IP编址 1、IP地址组成 2、IP地址表达 3、IP 地址分类 4、IP地址类型 5、IP网络通信 6、子网掩码 7、默认子网掩码 8、IP 地址规划 9、有类IP编制缺陷 10、VLSM 11、变长子网掩码案例 12、网关 13、无类域间路由 一、IP编址 网络层位于数据链路层与传输层之间…

Python之装饰器三 踩坑(带参数,不带参数,两者都带参数)

文章目录 前言一、装饰器不带参数(但是装修器内部的函数又需要参数)二、装饰器带参数(但是被装饰的函数不带参数)三、装饰器带参数(并且被装饰的函数也带参数)总结前言 Python装饰器里面遇到的踩坑点,以及自己的理解。 一、装饰器不带参数(但是装修器内部的函数又需要…

蓝桥杯好数

样例输入&#xff1a; 24 输出&#xff1a;7 输入&#xff1a;2024 输出&#xff1a; 150 思路&#xff1a;本题朴素方法的时间复杂度是O(n * log10(n)) &#xff0c;不超时。主要考察能否逐位取数&#xff0c;注意细节pi&#xff0c;这样不会改变i,否则会导致循环错误。 #in…

人工智能之自动驾驶技术体系

自动驾驶技术体系 自动驾驶技术是人工智能在交通领域的重要应用&#xff0c;旨在通过计算机视觉、传感器融合、路径规划等技术实现车辆的自主驾驶。自动驾驶不仅能够提高交通效率&#xff0c;还能减少交通事故和环境污染。本文将深入探讨自动驾驶的技术体系&#xff0c;包括感…

Vue 实现通过URL浏览器本地下载 PDF 和 图片

1、代码实现如下&#xff1a; 根据自己场景判断 PDF 和 图片&#xff0c;下载功能可按下面代码逻辑执行 const downloadFile async (item: any) > {try {let blobUrl: any;// PDF本地下载if (item.format pdf) {const response await fetch(item.url); // URL传递进入i…

Microsoft 365 Copilot中使用人数最多的是哪些应用

今天在浏览Microsoft 365 admin center时发现&#xff0c;copilot会自动整理过去30天内所有用户使用copilot的概况&#xff1a; 直接把这个图丢给copilot让它去分析&#xff0c;结果如下&#xff1a; 总用户情况 总用户数在各应用中均为 561 人&#xff0c;说明此次统计的样本…

Spring Boot (maven)分页4.0.1版本 专业版- 改

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

装修流程图: 装修前准备 → 设计阶段 → 施工阶段 → 安装阶段 → 收尾阶段 → 入住

文章目录 引言I 毛坯房装修的全流程**1. 装修前准备****1.1 确定装修预算****1.2 选择装修方式****1.3 选择装修公司****1.4 办理装修手续****2. 设计阶段****2.1 量房****2.2 设计方案****2.3 确认方案****3. 施工阶段****3.1 主体拆改****3.2 水电改造****3.3 防水工程****3.…

若依-@Excel新增注解numberFormat

Excel注解中原本的scale会四舍五入小数&#xff0c;导致进度丢失 想要的效果 显示的时候保留两个小数真正的数值是保留之前的数值 还原过程 若以中有一個專門的工具类&#xff0c;用来处理excel的 找到EXCEL导出方法exportExcel()找到writeSheet,写表格的方法找到填充数据的方法…