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

Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy

文章目录

  • 一、Policies
  • 二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略
    • 2.1、文件达到指定大小就归档
  • 三、TimeBasedTriggeringPolicy:基于时间间隔的滚动策略
    • 3.1、验证秒钟归档场景
    • 3.2、验证分钟场景
    • 3.3、验证小时场景
  • 四、多策略组合使用
  • 五、扩展知识
    • 5.1、SizeBasedTriggeringPolicy的单位不区分大小写
    • 5.2、$${date与%d的区别
  • 六、可能遇到的问题
    • 6.1、日志切分不生效?
    • 6.2、TimeBasedTriggeringPolicy到达时间后日志没滚动?

本文讲解Log4j2配置文件xml中的Policies属性。

一、Policies

Policy 是用来控制日志文件何时(When)进行 Rolling/滚动的;

所谓「日志滚动」就是当达到设定的条件后,日志文件进行切分。比如:让系统中的日志按日进行切分,并且按年月归档。

Policy下的若配置了多个滚动策略,则满足任意一个条件后都会触发日志归档。

<RollingFile name="RollingFile" fileName="logs/app.log"filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"><PatternLayout><Pattern>%d %p %c{1.} [%t] %m%n</Pattern></PatternLayout><Policies><!-- 每 5s 翻滚一次 --><!--<CronTriggeringPolicy schedule="0/5 * * * * ?" />--><!-- 每 5小时 翻滚一次 --><TimeBasedTriggeringPolicy interval="5" modulate="true"/><!-- 每 100MB 翻滚一次 --><SizeBasedTriggeringPolicy size="100 MB"/></Policies>
</RollingFile>

二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略

SizeBasedTriggeringPolicy: 当日志文件达到指定大小,就会文件归档,生成一个新的文件。
更多信息见官网 https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#SizeBasedTriggeringPolicy

一旦文件达到指定大小,SizeBasedTriggingPolicy就会导致滚动。单位可以是KBMBGBTB (单位不区分大小写),例如20MB

  1. 不与基于时间的触发策略结合使用时,基于大小的触发策略将导致时间戳值发生变化。
  2. 当与基于时间的触发策略结合使用时,Appender的filePattern属性必须包含%i,否则目标文件将在每次滚动时被覆盖, %i就类似于一个整数计数器,例如配置<DefaultRolloverStrategy max="5"/>,当文件个数达到5个的时候会循环覆盖前面已归档的1-5个文件。若不设置该参数,默认为7。

2.1、文件达到指定大小就归档

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5"><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--变量配置--><Properties><!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--><!-- %logger{36} 表示 Logger 名字最长36个字符 --><property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="./logs" /><property name="FILE_NAME" value="demo" /></Properties><appenders><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz"><PatternLayout pattern="${LOG_PATTERN}"/><Policies><SizeBasedTriggeringPolicy size="1KB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><loggers><root level="debug"><appender-ref ref="RollingFileInfo"/></root></loggers></configuration>

上述模板中,日志先写入info.log中,每当文件大小达到1KB时,按照在./logs/2024-12-25/目录下以demo-info-2024-12-25_1.log.gz格式对该日志进行压缩重命名并归档,并生成新的文件info.log进行日志写入。

如下图,每次info日志达到1KB时,就会进行归档,生成新的文件。
在这里插入图片描述

三、TimeBasedTriggeringPolicy:基于时间间隔的滚动策略

基于时间的触发策略允许你按照指定的时间间隔来滚动(分割)日志文件。
更多信息参见官网:https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#TimeBasedTriggeringPolicy

参数TypeDescription
interval
间隔
integer控制归档频率,默认值为1单位取自filePattern中配置的最小时间单位
如:filePattern中最小时间单位为小时,如果interval=1,则1小时归档一次;如果interval=2,则2小时归档一次。
modulate
调整
boolean控制是否对interval进行调节,默认为false。若为true,会以0为开始对interval进行偏移计算。
例如,当单位为小时时,当前为3:14,interval为4。
若为false:则后面归档时间依次为3:00,7:00,11:00,15:00,19::00,23:00;
若为true:则后面归档时间依次为0:00,4:00,8:00,12:00,16:00,20:00
maxRandomDelay
最大随机延迟
integer指示随机延迟过渡的最大秒数。默认值为0,表示没有延迟。
此设置在配置了多个应用程序以同时滚动日志文件的服务器上很有用,并且可以在整个时间上分散这样做的负担。

modulate 参数是用来调整日志滚动时间的。比如指定了interval间隔为每5分钟归档一次日志,此时时间为3:13。
若modulate=false:则表示从日志起始时间每5分钟归档一次,后面归档时间依次是3:13:00-3:17:59(5分钟),3.21,3.26, 3.31…
若modulate=true:则表示从0开始每5分钟归档一次,后面归档时间依次是3:13:00-3:14:59,3:15:00-3:19:59,3.24, 3.29…

官网中也说明了interval的单位是由最后一个%d{...}决定的。
在这里插入图片描述

3.1、验证秒钟归档场景

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="5"><!--变量配置--><Properties><property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="./logs" /></Properties><appenders><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gz"><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,本示例指的是4秒单位是由于filePattern中的最小单位决定的,本示例中filePattern的格式是年月日时分秒,所以最小单位是秒。--><TimeBasedTriggeringPolicy interval="4"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><loggers><root level="info"><appender-ref ref="RollingFileInfo"/></root></loggers></configuration>

上述模板中,日志先写入info.log中,每经过4s时(因为filePattern中 {yyyy-MM-dd-HH-mm-ss} 最小时间单位为秒),按照在./logs目录下以/yyyy-MM-dd/info-yyyy-MM-dd-HH-mm-ss_i.log格式对该日志进行压缩重命名并归档,并生成新的文件info.log进行日志写入。
在这里插入图片描述

3.2、验证分钟场景

modulate="false"

filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gz"><TimeBasedTriggeringPolicy interval="5" modulate="false"/>结果:
2024-12-25 17:08:33:启动服务开始记录第一条日志info-2024-12-25-17-12_1.log
2024-12-25 17:08:33  本日志文件:启动服务开始记录第一条日志
2024-12-25 17:12:59  本日志文件最后一条日志info-2024-12-25-17-17_1.log
2024-12-25 17:13:00 本日志文件开始时间
2024-12-25 17:17:59 本日志文件结束时间

可以发现当modulate="false"时不会对日志切分时间进行校准,从日志起始时间每隔指定时间后归档日志,上述示例中从日志起始时间,每5分钟归档一次日志。
在这里插入图片描述

modulate="true"

filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gz"><TimeBasedTriggeringPolicy interval="5" modulate="true"/>结果:
2024-12-25 17:12:33:启动服务开始记录第一条日志info-2024-12-25-17-14_1.log
2024-12-25 17:12:33  本日志文件:启动服务开始记录第一条日志
2024-12-25 17:14:59  本日志文件最后一条日志info-2024-12-25-17-19_1.log
2024-12-25 17:15:00 本日志文件开始时间
2024-12-25 17:19:59 本日志文件结束时间

可以发现当modulate="true"时对日志切分时间进行校准, 以0点自动校准进行文件切分,从0点开始每隔指定时间后归档日志,上述示例中从0点开始每5分钟归档一次日志。

3.3、验证小时场景

modulate="true"

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="5"><!--变量配置--><Properties><property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="./logs" /></Properties><appenders><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH}_%i.log.gz"><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,本示例指的是5小时单位是由于filePattern中的最小单位决定的,本示例中filePattern的格式是年月日时,所以最小单位是小时。--><TimeBasedTriggeringPolicy interval="5" modulate="true"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><loggers><root level="info"><appender-ref ref="RollingFileInfo"/></root></loggers></configuration>结果:
2024-12-25 7:12:33:启动服务开始记录第一条日志info-2024-12-25-9_1.log
2024-12-25 7:12:33  本日志文件:启动服务开始记录第一条日志
2024-12-25 9:59:59  本日志文件最后一条日志info-2024-12-25-14_1.log
2024-12-25 10:00:00 本日志文件开始时间
2024-12-25 14:59:59 本日志文件结束时间

如上modulate="true"设置后,假如7点12分的日志开始重启服务,日志先写入logs/info.log中则10点触发一次rollover操作{[0-5),[5-10),[10-15),[15-20)},生成info-2024-12-25-9_1.log对该日志进行压缩重命名并归档,并生成新的文件info.log进行日志写入;然后每间隔5小时,则下一次是15点触发一次rollover。

四、多策略组合使用

多个不同的策略可以组合使用,先满足哪个策略条件就基于哪个策略生成log文件。

<?xml version="1.0" encoding="UTF-8"?>
<configuration monitorInterval="5"><!--变量配置--><Properties><property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="./logs" /></Properties><appenders><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH}_%i.log.gz"><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><SizeBasedTriggeringPolicy size="10MB"/><TimeBasedTriggeringPolicy interval="5" modulate="true"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><loggers><root level="info"><appender-ref ref="RollingFileInfo"/></root></loggers></configuration>

上述模板中,日志先写入info.log中,每当文件大小达到10MB或者当时间间隔到达5小时(由%d{yyyy-MM-dd-HH}决定),触发rollover操作,按照在./logs/yyyy-MM-dd目录下以info-2024-12-25-9_1.log.gz格式对该日志进行压缩重命名并归档,并生成新的文件info.log进行日志写入。

五、扩展知识

5.1、SizeBasedTriggeringPolicy的单位不区分大小写

如下:SizeBasedTriggeringPolicy的单位不区分大小写。

<SizeBasedTriggeringPolicy size="10MB"/>
<SizeBasedTriggeringPolicy size="10mb"/>
<SizeBasedTriggeringPolicy size="10Kb"/>

详情也可参见官网https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#SizeBasedTriggeringPolicy
在这里插入图片描述

解析SizeBasedTriggeringPolicy 中size属性的java类是org.apache.logging.log4j.core.appender.rolling.FileSize,在这个类中对单位进行了忽略大小写。

5.2、$${date与%d的区别

上面的示例中我们看到日期格式有两种写法,代码如下,那么这两种写法有什么区别呢?

filePattern="${FILE_PATH}/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH}_%i.log.gz"$${date:…}和%d{…}转换模式不等效:
$${date:}格式化当前日期。
%d{}格式化上次滚动的日期。

官网地址:https://logging.apache.org/log4j/2.x/manual/appenders/rolling-file.html#conversion-patterns
在这里插入图片描述

六、可能遇到的问题

6.1、日志切分不生效?

在测试过程中,配置Policies中的策略后发现日志没有归档,log4j2配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5"><!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --><!--变量配置--><Properties><!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--><!-- %logger{36} 表示 Logger 名字最长36个字符 --><property name="LOG_PATTERN" value="%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" /><!-- 定义日志存储的路径 --><property name="FILE_PATH" value="../logs" /><property name="FILE_NAME" value="demo" /></Properties><appenders><!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--><RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd HH:mm}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,默认是1 hour小时单位是由于filePattern中的最小单位决定的,本示例中filePattern的格式是年月日,所以最小单位是小时。若filePattern格式是时分秒,则TimeBasedTriggeringPolicy的单位是秒。--><!--<TimeBasedTriggeringPolicy interval="1"/>--><SizeBasedTriggeringPolicy size="1KB"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/></RollingFile></appenders><!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--><!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--><loggers><!-- additivity:是否向上级logger传递打印信息。默认是true--><!--[需修改] level: 若需要打印sql日志则需要修改为debug级别;否则为info级别。 --><Logger name="com.example" level="debug" additivity="true"></Logger><root level="info"><appender-ref ref="RollingFileInfo"/></root></loggers></configuration>

报错日志
项目启动后日志没有归档,并且有日志报错:

Connected to the target VM, address: '127.0.0.1:15970', transport: 'socket'.   ____          _            __ _ _/\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/  ___)| |_)| | | | | || (_| |  ) ) ) )'  |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot ::                (v2.4.7)[2024-12-25 11:26:38,143][main][INFO][org.springframework.boot.StartupInfoLogger]: Starting MainApplication using Java 1.8.0_202 on LAPTOP-9UHA7CHR with PID 22036 (D:\WorkSpace\springboot-bucket\springboot-log4j2\target\classes started by 13488 in D:\WorkSpace\springboot-bucket)
[2024-12-25 11:26:38,149][main][DEBUG][org.springframework.boot.StartupInfoLogger]: Running with Spring Boot v2.4.7, Spring v5.3.8
[2024-12-25 11:26:38,150][main][INFO][org.springframework.boot.SpringApplication]: No active profile set, falling back to default profiles: default
[2024-12-25 11:26:38,951][main][INFO][org.springframework.boot.web.embedded.tomcat.TomcatWebServer]: Tomcat initialized with port(s): 8080 (http)
[2024-12-25 11:26:38,956][main][INFO][org.apache.juli.logging.DirectJDKLog]: Initializing ProtocolHandler ["http-nio-8080"]
[2024-12-25 11:26:38,957][main][INFO][org.apache.juli.logging.DirectJDKLog]: Starting service [Tomcat]
[2024-12-25 11:26:38,957][main][INFO][org.apache.juli.logging.DirectJDKLog]: Starting Servlet engine: [Apache Tomcat/9.0.46]
[2024-12-25 11:26:38,958][main][INFO][org.apache.juli.logging.DirectJDKLog]: Loaded Apache Tomcat Native library [1.2.31] using APR version [1.7.0].
[2024-12-25 11:26:38,958][main][INFO][org.apache.juli.logging.DirectJDKLog]: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
2024-12-25 11:26:38,962 main ERROR Unable to rename file D:\WorkSpace\springboot-bucket\..\logs\info.log to D:\WorkSpace\springboot-bucket\..\logs\demo-INFO-2024-12-25 11:26_1.log: java.nio.file.InvalidPathException Illegal char <:> at index 62: D:\WorkSpace\springboot-bucket\..\logs\demo-INFO-2024-12-25 11:26_1.log

问题原因及解决方法
从报错日志中我们可以看到,由于项目filePattern属性中引用了相对路径,导致文件没找到,所以项目配置中应该避免使用相对路径

6.2、TimeBasedTriggeringPolicy到达时间后日志没滚动?

1、场景说明:
项目中配置了TimeBasedTriggeringPolicy按时间滚动策略,但是项目运行后发现到达指定时间后,日志文件并没有归档。

配置如下:

<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/%d{yyyy-MM-dd}/info-%d{yyyy-MM-dd-HH-mm-ss}_%i.log.gz"><!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--><ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/><PatternLayout pattern="${LOG_PATTERN}"/><Policies><!--interval属性用来指定多久滚动一次,本示例指的是4秒
单位是由于filePattern中的最小单位决定的,本示例中filePattern的格式是年月日时分秒,所以最小单位是秒。
--><TimeBasedTriggeringPolicy interval="4"/></Policies><!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--><DefaultRolloverStrategy max="15"/>
</RollingFile>

如上配置,info.log文件应该每隔4秒都归档的,但是实际发现并没有生成归档文件。

2、原因及解决方法
问题原因:如果在设置的滚动时间间隔内没有产生新的日志内容,即使满足滚动条件,当前的日志文件也不会被滚动。

我遇到的示例就是因为日志文件没有产生新的内容,所以并没有滚动归档。



参考文章:
https://blog.csdn.net/weixin_37646636/article/details/135923164


创作不易,欢迎打赏,你的鼓励将是我创作的最大动力。

在这里插入图片描述

相关文章:

Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy

文章目录 一、Policies二、SizeBasedTriggeringPolicy:基于文件大小的滚动策略2.1、文件达到指定大小就归档 三、TimeBasedTriggeringPolicy&#xff1a;基于时间间隔的滚动策略3.1、验证秒钟归档场景3.2、验证分钟场景3.3、验证小时场景 四、多策略组合使用五、扩展知识5.1、S…...

js版本之ES6特性简述【Proxy、Reflect、Iterator、Generator】(五)

目录 Proxy Reflect 静态方法 部分实例 Iterator 实际开发迭代器的使用实例 迭代器&#xff08;Iterator&#xff09;应用 Generator Proxy Proxy 是 ES6 中新增的对象 Proxy 是JavaScript中的内置对象&#xff0c;它提供了一种机制&#xff0c;可以拦截并自定义各种…...

微信V3支付报错 平台证书及平台证书序列号

1.平台证书及平台证书序列号设置错误报错&#xff1a; 错误1&#xff1a; Verify the response’s data with: timestamp1735184656, noncea5806b8cabc923299f8db1a174f3a4d0, signatureFZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvE…...

【开发问题记录】执行 git cz 报require() of ES Module…… 错误

文章目录 1、问题2、解决3、参考链接 1、问题 在对 commitizen 进行完&#xff0c;一系列的初始化以后 &#xff0c; 对代码进行 提交 到暂存区&#xff0c;然后要提交到 本地仓库 的报错 然后因为安装了 commitizen 所以是想用 git cz 进行提交的&#xff0c; 执行命令的时候…...

Kubernetes 安装 Nginx以及配置自动补全

部署 Nginx &#xff1a; [rootk8s-master ~]# kubectl create deployment nginx --imagenginx:1.14-alpine deployment.apps/nginx created暴露端口&#xff1a; [rootk8s-master ~]# kubectl expose deployment nginx --port80 --typeNodePort service/nginx exposed查看服…...

JS中的闭包和上下文

变量提升 和 函数提升 这里要提到一个提升的概念&#xff0c;即在JS中&#xff0c;在解析代码之前还有一个预处理的过程&#xff0c;这个过程中会把部分变量和函数声明提前到代码的最顶部&#xff0c; 会在其他所有代码之前执行。虽然当我们按照规范&#xff08;严格模式或者T…...

element-ui表格多级表头固定列和合并单元格

多级表头固定列 代码示例-不能直接运行&#xff0c;仅供参考 <el-table ref"table" class"table":data"list"style"width: 100%":header-cell-style"headerCellStyle"v-loading"dataLoading":span-method&qu…...

视频汇聚融合云平台Liveweb一站式解决视频资源管理痛点

随着5G技术的广泛应用&#xff0c;各领域都在通信技术加持下通过海量终端设备收集了大量视频、图像等物联网数据&#xff0c;并通过人工智能、大数据、视频监控等技术方式来让我们的世界更安全、更高效。然而&#xff0c;随着数字化建设和生产经营管理活动的长期开展&#xff0…...

第五十九章 假脱机设备

文章目录 第五十九章 假脱机设备介绍打开和使用假脱机设备用于假脱机设备的 OPEN 和 USE 命令USE 命令 第五十九章 假脱机设备 介绍 IRIS数据平台使能够将打印输出直接发送到您的打印机或屏幕&#xff0c;或将其保留在后台打印中以供以后打印。IRIS 假脱机独立于您的操作系统…...

Maven Wrapper 报错“未找到有效的 Maven 安装”

1. 检查 Maven Wrapper 配置&#xff1a; 确保你的项目中包含 .mvn/wrapper/maven-wrapper.properties 文件。 检查该文件中的 distributionUrl 属性&#xff0c;确保它指向一个有效的 Maven 发行版 URL。 2.确认 Maven Wrapper 脚本存在&#xff1a; 在项目根目录下&#x…...

yarn list --pattern vuex-module-decorators

dgqdgqdeMac-mini spid-admin % yarn list --pattern vuex-module-decorators yarn list v1.22.22 └─ vuex-module-decorators0.16.1 ✨ Done in 0.24s.好的&#xff0c;这段代码是一个典型的 Vuex 模块定义&#xff0c;使用了 vuex-module-decorators 库。这个库为 Vuex 提…...

day19-Linux软件包

科普&#xff0c;什么是代码文件。 电脑程序Program&#xff0c;就是某一个编程语言编写的一个代码文件&#xff0c;里面包含了该语言特有的指令&#xff0c;以及各种字符、符号。 linux自带的network管理脚本&#xff0c;shell脚本 什么是软件程序。 软件程序&#xff0c;就…...

【网络分析工具】WireShark的使用(超详细)

网络分析工具——WireShark的使用 简介WireShark软件安装Wireshark 开始抓包示例WireShark抓包界面WireShark 主要分为这几个界面TCP包的具体内容Wireshark过滤器设置wireshark过滤器表达式的规则Wireshark抓包分析TCP三次握手Wireshark分析常用操作 简介 WireShark是非常流…...

React 高级组件开发:动态逻辑与性能优化

React 高级组件开发&#xff1a;动态逻辑与性能优化 引言一、动态逻辑与配置化组件1. 动态组件的设计 二、自定义 Hooks 解决复杂状态管理1. 自定义 Hook 的优势 三、高阶组件&#xff08;HOC&#xff09;模式1. 高阶组件的应用场景 四、性能优化1. 使用 React.memo 优化渲染2.…...

Vue 3 与 Tauri 集成开发跨端APP

1、安装RUST 下载地址&#xff1a;Install Rust - Rust Programming Language 安装&#xff1a; 安装完成后&#xff0c;在命令行里运行: rustup 2、安装 Node.js 与 npm 或 pnpm &#xff0c;如果已经安装&#xff0c;可以忽略 # 使用 nvm 安装 Node.js 最新版本 nvm install…...

FreeRTOS中xPortPendSVHandler()和vPortSVCHandler()这两个函数的作用

在 FreeRTOS 中&#xff0c;xPortPendSVHandler() 和 vPortSVCHandler() 是两个重要的中断服务例程&#xff08;ISR&#xff09;&#xff0c;它们负责处理与操作系统相关的异常。这些函数对于实现上下文切换和任务管理至关重要。下面分别解释这两个函数的作用&#xff1a; xPo…...

【RK3588 Linux 5.x 内核编程】-内核IO复用与poll

内核IO复用与poll 文章目录 内核IO复用与poll1、IO复用2、Poll的使用2.1 用户空间程序中使用Poll2.2 在内核空间实现Poll3、驱动程序实现4、用户空间程序实现5、验证让我们假设应用程序想要根据其状态读取/写入许多 IO(输入和输出)的情况。 在这种情况下我们该怎么办? 我们必…...

精选9个自动化任务的Python脚本精选

大家好&#xff0c;我是老邓&#xff0c;今天我们来一起学习如何用Python进行一些常见的自动化操作&#xff0c;涉及文件处理、网络交互等实用技巧。即使你没有任何Python基础也没关系&#xff0c;我会用最通俗易懂的语言来讲解。 1. 对目录中的文件进行排序 import osdef so…...

使用JFLASH批量烧录程序导入生产的简易设置

基于上一篇帖子我们可以把任意厂家的MCU导入jflash来使用 首先&#xff0c;我使用的是V699C版本&#xff0c;目前使用了一段时间没有问题 我尝试过换不同的电路板烧录连续烧录&#xff0c;当单片机里没有程序的时候&#xff0c;问题不大&#xff0c;但是一旦单片机里有程序的话…...

计算机体系结构期末复习1:分支预测

目录 一、为什么需要分支预测 1.存在分支的指令 2.控制相关的处理方式一&#xff1a;stall(阻塞&#xff09;流水线 二、分支预测方法 1.预测正确与预测错误的性能损失 2.减少预测错误的惩罚 3.提高分支预测的准确度 1&#xff09;编译时&#xff08;静态方法&#xff…...

获取页面上所有的img,并保存到本地

浏览器的 JavaScript 环境中受限于安全和隐私原因&#xff0c;不允许直接指定下载文件夹或访问本地文件系统。因此&#xff0c;无法通过纯 JavaScript 在浏览器控制台中实现下载图片到指定文件夹的功能。 然而&#xff0c;您可以使用 Web API 提供的文件系统访问 API 进行一定…...

Day56 图论part06

108.冗余连接 并查集应用类题目,关键是如何把题意转化成并查集问题 代码随想录 import java.util.Scanner;public class Main{public static void main (String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();DisJoint disjoint = new DisJo…...

深度学习助力股市预测:LSTM、RNN和CNN模型实战解析

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;众所周知&#xff0c;传统的股票预测模型有着各种各样的局限性。但在我的最新研究中&#xff0c;探索了一些方法来高效预测股市走势&#xff0c;即CNN、RNN和LSTM这些深度学习…...

.NET能做什么?全面解析.NET的应用领域

.NET 是由微软开发的一个开源、跨平台的开发框架。它不仅支持构建各种应用程序&#xff0c;还能运行在不同的操作系统上&#xff0c;包括 Windows、Linux 和 macOS。自从 .NET Core 的推出&#xff0c;.NET 成为了一个现代化的开发平台&#xff0c;能够满足企业和开发者日益多样…...

分布式事务入门 一

分布式事务入门 一 您好&#xff0c;我是今夜写代码,今天学习下分布式事务相关理论&#xff0c;以及常见的解决方案&#xff0c;为后续掌握Seata分布式事务框奠定基础。 为什么需要分布式事务? 分布式事务主要由于存储资源的分布性&#xff0c;通常涉及多个数据库。 分布式…...

华为,新华三,思科网络设备指令

1. 设备信息查看 华为 display version # 查看设备版本信息 display device # 查看设备硬件信息 新华三&#xff08;H3C&#xff09; display version # 查看设备版本信息 display device # 查看设备硬件信息 锐捷 show version …...

深入理解HTML页面加载解析和渲染过程(一)

一篇老文章&#xff0c;存在草稿有点可惜 HTML页面呈现通常包括三个主要过程&#xff1a;加载、解析和渲染。让我们详细探讨每个过程。 1. 加载过程 加载过程主要涉及获取页面所需的所有资源。这个过程包括以下步骤&#xff1a; 1.1 URL资源加载 缓存读取&#xff1a;浏览器…...

Odoo 免费开源 ERP:通过 JavaScript 创建对话框窗口的技术实践分享

作者 | 老杨 出品 | 上海开源智造软件有限公司&#xff08;OSCG&#xff09; 概述 在本文中&#xff0c;我们将深入研讨如何于 Odoo 18 中构建 JavaScript&#xff08;JS&#xff09;对话框或弹出窗口。对话框乃是展现重要讯息、确认用户操作以及警示用户留意警告或错误的行…...

Word批量更改题注

文章目录 批量更改批量去除空格 在写文章的时候&#xff0c;往往对图片题注有着统一的编码要求&#xff0c;例如以【图 1- xx】。一般会点击【引用】->【插入题注】来插入题注&#xff0c;并且在引用的时候&#xff0c;点击【引用】->【交叉引用】&#xff0c;并且在交叉…...

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…...

OpenCV相机标定与3D重建(36)计算两幅图像之间基本矩阵(Fundamental Matrix)的函数findFundamentalMat()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从两幅图像中的对应点计算基本矩阵。 cv::findFundamentalMat 是 OpenCV 中用于计算两幅图像之间基本矩阵&#xff08;Fundamental Matrix&#…...

JQ中的each()方法与$.each()函数的使用区别

介绍 jquery里的 each() 是一个强大的遍历工具&#xff0c;用于迭代集合中的元素&#xff0c;并为每个元素执行指定的函数‌。它既可以用于遍历 jQuery对象集合&#xff0c;也可以用于遍历普通的数组或对象。 each()对象遍历 语法&#xff1a; $(selector).each(function(in…...

浅谈下雪花算法的原理,及在项目中使用需要注意哪些事项

目录 背景 雪花算法原理 算法特点 注意事项 总结 背景 雪花算法是一种分布式ID生成算法&#xff0c;由Twitter提出&#xff0c;用于在分布式系统中生成全局唯一的ID。该算法通过将64位的长整型数字分为符号位、时间戳、工作机器ID和序列号四个部分&#xff0c;确保了ID的…...

洛谷P1536 村村通(c嘎嘎)

题目链接&#xff1a;P1536 村村通 - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及/提高 解题思路&#xff1a;本题很明显考察是并查集&#xff0c;并查集之前我的博客介绍过可以看看这篇 洛谷P1551 亲戚&#xff08;c嘎嘎&#xff09;-CSDN博客&#xff0c;本题是…...

双指针——查找总价格为目标值的两个商品

一.题目描述 LCR 179. 查找总价格为目标值的两个商品 - 力扣&#xff08;LeetCode&#xff09; 二.题目解析 这个题目非常简单&#xff0c;其实就是判断有没有两个数加起来等于target。 三.算法解析 1.暴力解法 暴力解法的话我们可以枚举出所有的情况&#xff0c;然后判…...

智慧园区小程序开发制作功能介绍

智慧园区小程序开发制作功能介绍 智慧园区小程序系统作为一款面向园区企业的一站式线上服务平台&#xff0c;可为企业提供数智化的园区办公服务。智慧园区小程序功能介绍 1、园区公告、政策信息查看足不出户掌握最新动态&#xff0c;“园区公告、政策信息”等信息。首页点击对应…...

【面经】25届 双非本科 字节跳动 北京 四年的总结

点击“硬核王同学”&#xff0c;选择“关注” 福利干货第一时间送达 大家好&#xff0c;我是硬核王同学&#xff0c;最近在做免费的嵌入式知识分享&#xff0c;帮助对嵌入式感兴趣的同学学习嵌入式、做项目、找工作&#xff01; 给大家分享一个25届本科大佬的面经&#xff0c…...

MySql幻读问题

认识具有反复性。 之前以为理解了幻读&#xff0c;最近看黑马的mysql教程以为再次加深了认识。然而现在认为之前的理解都是错误的&#xff0c;而且网上很多关于幻读的解释&#xff0c;都不太准确。 关于幻读的最佳解释还是要看官网mysql官网幻读解释 脏读和不可重复读比较好理…...

欧拉计划启航篇(一)

目录 1.什么是欧拉计划 2.简单介绍 3.访问不上去怎么办 4.第一题的代码编写 5.代码的优化 1.什么是欧拉计划 欧拉计划是和我们的数学知识相关的一个网站&#xff0c;但是这个网站上面的相关的问题需要我们去使用编程的知识去进行解决&#xff0c;因此这个适合对于想要提升…...

Pandas系列|第二期:Pandas中的数据结构

1.Pandas中的数据结构&#xff1a;Series和DataFrame Pandas 的主要数据结构是 Series &#xff08;一维数据&#xff09;与 DataFrame&#xff08;二维数据&#xff09;&#xff0c;这两种数据结构足以处理金融、统计、社会科学、工程等领域里的大多数典型用例。 Series 是一…...

GitLab 服务变更提醒:中国大陆、澳门和香港用户停止提供服务(GitLab 服务停止)

目录 前言 一. 变更详情 1. 停止服务区域 2. 邮件通知 3. 新的服务提供商 4. 关键日期 5. 行动建议 二. 迁移指南 三. 注意事项 四. 相关推荐 前言 近期&#xff0c;许多位于中国大陆、澳门和香港的 GitLab 用户收到了一封来自 GitLab 官方的重要通知。根据这封邮件…...

基于openEuler22.09部署OpenStack Yoga云平台(一)

OpenStack Yoga部署 安装OpenStack 一、基础准备 基于OpenStack经典的三节点环境进行部署&#xff0c;三个节点分别是控制节点&#xff08;controller&#xff09;、计算节点&#xff08;compute&#xff09;、存储节点&#xff08;storage&#xff09;&#xff0c;其中存储…...

信息安全管理:通用安全管理checklist

通用安全管理checklist是对信息安全管理调查问卷的一个补充&#xff0c;将以前没有包含的检查点纳入进来&#xff0c;算是对这个系列的一个拾遗与结尾。内容包含安全策略与计划、组织和人员安全、安全工程管理、安全产品管理与符合性五部分。 一、安全策略与安全计划 ▼▼安全…...

硬件设计-硬件 EMC 设计规范

目录 引言&#xff1a; 常见原因 总体概念及考虑 布局 屏蔽 滤波 引言&#xff1a; 本规范只简绍 EMC 的主要原则与结论&#xff0c;为硬件工程师们在开发设计中抛砖引玉。 电磁干扰的三要素是干扰源、干扰传输途径、干扰接收器。EMC 就围绕这些 问题进行研究。最基本的…...

【C++】数据结构 单链表的实现(企业存储用户数据的实现)

本篇博客给大家带来的是用C语言来实现数据结构的单链表&#xff08;企业存储用户数据的实现&#xff09; &#x1f41f;&#x1f41f;文章专栏&#xff1a;C &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享 你们的支持…...

【Vue3+ts入门小试牛刀】

Vue 3是一个流行的JavaScript框架&#xff0c;它提供了创建交互式用户界面的工具。Vite是一个现代化的构建工具&#xff0c;用于快速构建Vue应用。TypeScript是一种类型安全的JavaScript的超集&#xff0c;它可以帮助我们在开发过程中减少错误。 下面是一个使用Vue 3、Vite和T…...

AI发展新态势:从技术突破到安全隐忧

AI安全的新挑战 近期AI领域出现了令人担忧的新发现。根据最新研究,AI模型已经开始展现出策略性欺骗的倾向。具体表现在以下几个方面: 策略性欺骗行为的出现 在实验中发现,当研究人员试图让AI执行一些"反Anthropic"的操作时(如获取模型权限和外部服务器访问),模…...

肝功能不正常可以过教师入职体检吗?

如何看肝功能报告单 转氨酶正常等于肝功能正常吗?要想看懂肝功能报告单就要看懂各指标含义。 1、总胆红素TbiL正常值是 1.7-17.1μmol/L 急性黄疸型肝炎活动性肝炎肝坏死、肝癌、胰头癌都异常偏高。 2、直接胆红素 DbiL正常值是 0-6.84μmol/L 结石病、肝癌、胰头癌与这项…...

二百八十二、ClickHouse——删除Linux中的ClickHouse

一、目的 由于ClickHosue的库表发生变化&#xff0c;需要删除原有的表结构数据&#xff0c;才能直接把脚本里文件重新安装 二、删除步骤 1、关闭ClickHouse服务 systemctl stop clickhouse-server 2、卸载ClickHouse软件包 sudo yum remove clickhouse-server clickhouse…...

Disruptor 高性能环形消息框架

官方文档&#xff1a;Disruptor 1. 简介 Disruptor是一个高性能的互进程&#xff08;Inter-process&#xff09;和多线程&#xff08;Multi-threaded&#xff09;消息处理库&#xff0c;由LMAX交易所开发&#xff0c;用于在Java虚拟机&#xff08;JVM&#xff09;上实现高性能…...