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


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

在这里插入图片描述

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

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

相关文章

【机器学习与数据挖掘实战】案例06:基于Apriori算法的餐饮企业菜品关联分析

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈机器学习与数据挖掘实战 ⌋ ⌋ ⌋ 机器学习是人工智能的一个分支,专注于让计算机系统通过数据学习和改进。它利用统计和计算方法,使模型能够从数据中自动提取特征并做出预测或决策。数据挖掘则是从大型数据集中发现模式、关联…

EleutherAI/pythia-70m

EleutherAI/pythia-70m” 是由 EleutherAI 开发的一个小型开源语言模型&#xff0c;它是 Pythia Scaling Suite 系列中参数量最小的模型&#xff0c;拥有大约 7000 万个参数。这个模型主要旨在促进对语言模型可解释性的研究&#xff1b; Pythia Scaling Suite是为促进可解释性…

在国产电脑上运行PDFSAM软件使用pdf分割合并交替混合处理pdf文档

软件下载地址: https://sourceforge.net/projects/pdfsam/files/ 需要注意事项&#xff0c;系统需要java环境&#xff0c;确认系统有java环境&#xff0c;根据软件版本需求安装对应的java运行环境。 下载pdfsam-4.3.4-linux.tar.gz安装包&#xff0c;解压&#xff0c;将runt…

【HENU】河南大学计院2024 计算机网络 期末复习知识点

和光同尘_我的个人主页 一直游到海水变蓝。 计网复习 第一章互联网组成类别交换方式分组交换的要点&#xff1a;分组交换的优点&#xff1a; 网络性能指标体系结构网络协议五层协议 第二章&#xff1a;物理层物理层的主要任务&#xff08;四大特性&#xff09;通信的三种方式…

python网络框架——Django、Tornado、Flask和Twisted

Django、Tornado和flask是全栈网络框架&#xff0c;而Twisted更专注于网络底层的高性能封装&#xff0c;不提供HTML模版引擎等界面功能&#xff0c;因此不能称为全栈框架。 1、Django 发布于2003年&#xff0c;是当前python世界里最负盛名且最成熟的网络框架。相较于其他web框…

C++——运算符重载

一、运算符重载 ①含义 函数重载或函数多态&#xff1a;同名函数完成相同的基本操作 C将重载的概念扩展到运算符上&#xff0c;于是出现了运算符重载 C中有很多运算符已经被重载 *运算符&#xff0c;运用于地址&#xff0c;可以得到存储在这个地址的值&#xff1b;运用于两个…

IPv6的地址类型

IPv6地址总长度为128bit&#xff0c;被分为8组&#xff0c;每组为4个十六进制数&#xff0c;用冒号分隔&#xff1a; 例如&#xff1a;FC00:0123:4567:8901:ABFD:0987:0000:0023 可缩写为&#xff1a;FC00:0123:4567:8901:ABFD:0987::23 IPv6中取消了v4中的广播&#xff0c;新…

矢量网络分析仪(VNA)基础解析与应用指南

矢量网络分析仪&#xff08;VNA&#xff09;是一种极其精密的仪器&#xff0c;能够对电气网络的阻抗进行表征&#xff0c;测量结果可提供幅度和相位细节&#xff0c;从而深入了解其行为。被测设备&#xff08;DUT&#xff09;通常用于射频&#xff08;RF&#xff09;应用&#…

工厂+策略模式之最佳实践(疾病报卡维护模块API设计)

目录 &#x1f4bb;业务场景 &#x1f527;应用技术 ⚙概要流程 ❗开发注意 服务类上标注了 自定义注解 却无法直接利用getDeclaredAnnotation 获取 *Spring代理机制 代理机制的工作原理 代理的工作机制 代理的使用场景 已获取EmrXXXServiceImpl 的Class&#xff0c;如…

ARM异常处理 M33

1. ARMv8-M异常类型及其详细解释 ARMv8-M Exception分为两类&#xff1a;预定义系统异常(015)和外部中断(1616N)。 各种异常的状态可以通过Status bit查看&#xff0c;获取更信息的异常原因&#xff1a; CFSR是由UFSR、BFSR和MMFSR组成&#xff1a; 下面列举HFSR、MMFSR、…

【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART&#xff08;串口通讯&#xff09;2.1 简介2.2 时序图分析2.3 UART的…

Adversarial Machine Learning(对抗机器学习)

之前把机器学习&#xff08;Machine Learning&#xff09;的安全问题简单记录了一下&#xff0c;这里有深入研究了一些具体的概念&#xff0c;这里记录一下方便以后查阅。 Adversarial Machine Learning&#xff08;对抗机器学习&#xff09; Adversarial Examples 相关内容Eva…

【Go】context标准库

文章目录 1. 概述1.1 什么是 Context1.2 设计原理1.3 使用场景1.4 Context 分类核心:Context接口2. 源码解读4个实现emptyCtxTODO 和 BackgroundcancelCtxWithCancelcancelCtx.propagateCancel 构建父子关联parentCancelCtx 获取父上下文中的内嵌cancelCtxcanceltimerCtxWithT…

解决 vue3 中 echarts图表在el-dialog中显示问题

原因&#xff1a; 第一次点开不显示图表&#xff0c;第二次点开虽然显示图表&#xff0c;但是图表挤在一起&#xff0c;页面检查发现宽高只有100px,但是明明已经设置样式宽高100% 这可能是由于 el-dialog 还没有完全渲染完成&#xff0c;而你的 echarts 组件已经开始尝试渲染图…

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; &#xff09;。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案&#xff1a; C 2、在物理层接口特性中&#xff0c;用于描述完成每种功能的事件发…

通俗易懂!使用Excel和TF实现Transformer

本文旨在通过最通俗易懂的过程来详解Transformer的每个步骤&#xff01; 假设我们在做一个从中文翻译到英文的过程&#xff0c;我们的词表很简单如下&#xff1a; 中文词表&#xff1a;[机、器、学、习] 英文词表[deep、machine、learning、chinese] 先来看一下Transformer的…

智慧楼盘二维、三维组件融合 720三维全景可视化

本系统通过数字孪生技术&#xff0c;实现小区楼盘系统的可视化展示&#xff0c;整合楼盘内各个系统的数据源&#xff0c;将楼盘模型与房间模型、720三维全景图相结合&#xff0c;实现了从楼盘周边到室内布局的全方位展示&#xff0c;为购房者提供全方位的可视化信息。 整个项目…

QT QCombox QSS样式问题

/*combobox 样式*/ QComboBox#FileterComboBox,QComboBox#DateRangeComboBox{background-color: #262626; /* 背景颜色 */color: #e0e0e0; /* 文本颜色 */border-radius:16px;font-family: "Microsoft YaHei"; /* 文本字体族 */font-size: 18px; /* 文…

Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果

目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告&#xff1a;HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…