当前位置: 首页 > 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{...}决定的。
在这里插入图片描述

几个重要的配置项

1、fileName是日志生成后所在的文件名,filePattern是滚动机制发动后fileName归档后的文件名。如果fileName为空,fileName会被设置成filePattern。
2、filePattern:filePattern=“logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}_%i.log.gz”,其中红色部分$${date:yyyy-MM-dd},实现的效果是每天的日志会归档到同一天。
3、filePattern:filePattern=“logs/$${date:yyyy-MM-dd}/info-%d{yyyy-MM-dd}_%i.log.gz”,其中红色部分%i实现的效果是当程序在归档时,文件名序号会自动递增,最大值后面介绍。
4、TimeBasedTriggeringPolicy中设定的interval的单位是filePattern进行处理后获取的,具体来说就是filePattern=“logs/$${date:yyyy-MM-dd}/%d{yyyy-MM-dd-HH}.%i.log"中包含了"H”,会被转化成{RolloverFrequency.HOURLY}

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…...

ES中查询中参数的解析

目录 query中参数match参数match_allmatch:匹配指定参数match_phrase query中其他的参数query_stringprefix前缀查询:wildcard通配符查询:range范围查询&#xff1a;fuzzy 查询: 组合查询bool参数mustmust_notshould条件 其他参数 query中参数 词条查询term:它仅匹配在给定字段…...

学习笔记:使用 pandas 和 Seaborn 绘制柱状图

学习笔记&#xff1a;使用 pandas 和 Seaborn 绘制柱状图 前言 今天在使用 pandas 对数据进行处理并在 Python 中绘制可视化图表时&#xff0c;遇到了一些关于字体设置和 Seaborn 主题覆盖的小问题。这里将学习到的方法和注意事项做个总结&#xff0c;以便之后的项目中可以快…...

【每日学点鸿蒙知识】placement设置top、组件携带自定义参数、主动隐藏输入框、Web设置字体、对话框设置全屏宽

1、popup组件placement设置top没有生效&#xff1f; 可以用offset属性将popup往下边偏移一下 来规避 2、组件携带自定义参数的接口是哪个&#xff1f; 参考链接&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/ts-universal-attributes-…...

后端开发-Maven

环境说明&#xff1a; windows系统&#xff1a;11版本 idea版本&#xff1a;2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型&#xff08;POM&#xff09;&#xff0c;通过一组构建规则和约定来管理项目的构建&#xf…...

自动化办公-合并多个excel

在日常的办公自动化工作中&#xff0c;尤其是处理大量数据时&#xff0c;合并多个 Excel 表格是一个常见且繁琐的任务。幸运的是&#xff0c;借助 Python 语言中的强大库&#xff0c;我们可以轻松地自动化这个过程。本文将带你了解如何使用 Python 来合并多个 Excel 表格&#…...

mavlink移植到单片机stm32f103c8t6,实现接收和发送数据

前言&#xff1a; 好久没更新博客了&#xff0c;这两个月真的是异常的忙&#xff0c;白天要忙着公司里的事&#xff0c;晚上还要忙着修改小论文&#xff0c;一点自己的时间都没有了&#xff0c;不过确确实实是学到了很多东西&#xff0c;对无人机的技术研究也更深了一些。不过好…...

小程序基础 —— 08 文件和目录结构

文件和目录结构 一个完整的小程序项目由两部分组成&#xff1a;主体文件、页面文件&#xff1a; 主体文件&#xff1a;全局文件&#xff0c;能够作用于整个小程序&#xff0c;影响小程序的每个页面&#xff0c;主体文件必须放到项目的根目录下&#xff1b; 主体文件由三部分组…...

FIR数字滤波器设计——窗函数设计法——滤波器的时域截断

与IIR数字滤波器的设计类似&#xff0c;设计FIR数字滤波器也需要事先给出理想滤波器频率响应 H ideal ( e j ω ) H_{\text{ideal}}(e^{j\omega}) Hideal​(ejω)&#xff0c;用实际的频率响应 H ( e j ω ) H(e^{j\omega}) H(ejω)去逼近 H ideal ( e j ω ) H_{\text{ideal}}…...

MySQLOCP考试过了,题库很稳,经验分享。

前几天&#xff0c;本人参加了Oracle认证 MySQLOCP工程师认证考试 &#xff0c;先说下考这个证书的初衷&#xff1a; 1、首先本人是从事数据库运维的&#xff0c;今年开始单位逐步要求DBA持证上岗。 2、本人的工作是涉及数据库维护&#xff0c;对这块的内容比较熟悉&#xff…...

WPF 绘制过顶点的圆滑曲线 (样条,贝塞尔)

在一个WPF项目中要用到样条曲线&#xff0c;必须过顶点&#xff0c;圆滑后还不能太走样&#xff0c;捣鼓一番&#xff0c;发现里面颇有玄机&#xff0c;于是把我多方抄来改造的方法发出来&#xff0c;方便新手&#xff1a; 如上图&#xff0c;看代码吧&#xff1a; ----------…...

Kafka 幂等性与事务

文章目录 幂等性实现机制配置使用局限性 事务使用场景配置使用实现机制事务过程事务初始化事务开始事务提交事务取消事务消费 幂等性 Producer 无论向 Broker 发送多少次重复的数据&#xff0c;Broker 端只会持久化一条&#xff0c;保证数据不丢失且不重复。 实现机制 通过引…...

day2 Linux操作系统指令

思维导图 在家目录下创建目录文件&#xff0c;dir 1、dir下创建dir1和dir2 2、把当前目录下的所有文件拷贝到dir1中&#xff0c; 3、把当前目录下的所有脚本文件拷贝到dir2中 4、把dir2打包并压缩为dir2.tar.xz 5、再把dir2.tar.xz移动到dir1中 6、解压dir1中的压缩包 7、使用…...

AI一周重要会议和活动概览

一、小模型的曙光和机会之思辨高峰论坛 会议介绍&#xff1a;小模型的曙光和机会之思辨”高峰论坛暨第32期CSIG图像图形学科前沿讲习班于2025年1月3—4日在杭州举办&#xff0c;会议由中国图象图形学学会主办&#xff0c;中国图象图形学学会前沿科技论坛委员会承办。本次论坛设…...

重启ubuntu服务器,如何让springboot服务自动运行

文章目录 1. 使用 systemd 服务步骤&#xff1a; 2. 使用 cron 的 reboot 任务步骤&#xff1a; 3. 使用 init.d 脚本&#xff08;适用于较旧版本&#xff09;步骤&#xff1a; 推荐方案 为了确保在重启Ubuntu服务器后&#xff0c;让springboot的服务test.jar象 nohup java -ja…...

python系列教程237——启动扩展功能

朋友们&#xff0c;如需转载请标明出处&#xff1a;https://blog.csdn.net/jiangjunshow 声明&#xff1a;在人工智能技术教学期间&#xff0c;不少学生向我提一些python相关的问题&#xff0c;所以为了让同学们掌握更多扩展知识更好地理解AI技术&#xff0c;我让助理负责分享…...

U盘格式化工具合集:6个免费的U盘格式化工具

在日常使用中&#xff0c;U盘可能会因为文件系统不兼容、数据损坏或使用需求发生改变而需要进行格式化。一个合适的格式化工具不仅可以清理存储空间&#xff0c;还能解决部分存储问题。本文为大家精选了6款免费的U盘格式化工具&#xff0c;并详细介绍它们的功能、使用方法、优缺…...

循环神经网络(RNN)入门指南:从原理到实践

目录 1. 循环神经网络的基本概念 2. 简单循环网络及其应用 3. 参数学习与优化 4. 基于门控的循环神经网络 4.1 长短期记忆网络&#xff08;LSTM&#xff09; 4.1.1 LSTM的核心组件&#xff1a; 4.2 门控循环单元&#xff08;GRU&#xff09; 5 实际应用中的优化技巧 5…...

马原复习笔记

文章目录 前言导论物质实践人类社会资本主义社会主义共产主义后记 前言 一月二号下午四点多考试&#xff0c;很友好&#xff0c;不是早八&#xff0c;哈哈哈。之前豪言壮语和朋友说这次马原要全对&#xff0c;多做了几次测试之后&#xff0c;发现总有一些知识点是自己不知道的…...

Android Room 框架的初步使用

一、简介 Room 是一个强大的对象关系映射库&#xff0c;它允许你将 SQLite 数据库中的表映射到 Java 或 Kotlin 的对象&#xff08;称为实体&#xff09;上。你可以使用简单的注解&#xff08;如 Entity、Dao 和 Database&#xff09;来定义数据库表、数据访问对象&#xff08…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...