Log4j2的Policies详解、SizeBasedTriggeringPolicy、TimeBasedTriggeringPolicy

news2024/12/28 18:39:21

文章目录

  • 一、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.coloradmin.cn/o/2267060.html

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

相关文章

SpringCloudAlibaba实战入门之路由网关Gateway初体验(十一)

Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已经不打算整合 zuul2.0 了。 一、什么是网关 1、顾明…

#渗透测试#漏洞挖掘#红蓝攻防#常见未授权访问漏洞汇总

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

Fast adaptively balanced min-cut clustering

#0.论文信息 标题&#xff1a;Fast adaptively balanced min-cut clustering期刊&#xff1a;Pattern Recognition作者: Feiping Nie , Fangyuan Xie , Jingyu Wang ,Xuelong Li机构: China Telecom, Northwestern Polytechnic al University.代码链接&#xff1a; #1.摘要 …

【C++】——精细化哈希表架构:理论与实践的综合分析

先找出你的能力在哪里&#xff0c;然后再决定你是谁。 —— 塔拉韦斯特弗 《你当像鸟飞往你的山》 目录 1. C 与哈希表&#xff1a;核心概念与引入 2. 哈希表的底层机制&#xff1a;原理与挑战 2.1 核心功能解析&#xff1a;效率与灵活性的平衡 2.2 哈希冲突的本质&#x…

前端技术(26) : 全年排班日历

来源: 通义千问 效果图 代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>年度日历</title><style>body {font-family: Arial, sans-serif;}.calendar-container {margin: 20px au…

QT-------认识QT

QT简介 QT是一个跨平台的C图形用户界面应用程序框架&#xff0c;由挪威Trolltech公司于1991年开发并发布。它为开发者提供了一套丰富的类库和工具&#xff0c;用于创建各种类型的应用程序&#xff0c;包括桌面应用、移动应用、嵌入式系统应用等。QT具有高度的可定制性和可扩展…

Hive 部署

1 下载并安装 1.1 Hadoop安装 参考另一篇博客&#xff1a;Hadoop 部署 1.2 安装包下载 可通过下面网站下载&#xff1a; 官网&#xff1a;https://dlcdn.apache.org/hive/。清华源&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/apache/hive/。 比如下载apache-hive-4…

Linux中QT应用IO状态设置失效问题

问题&#xff1a;在进入freeze休眠前需要设置特定IO关闭电源灯操作&#xff0c;唤醒后需要将特定IO恢复原来正常工作状态&#xff0c;此时出现偶然性&#xff08;概率很低&#xff09;的IO控制失效问题&#xff1b;【平台&#xff1a;君正X1600HN】 一、问题点分析 1、电路 …

empire靶机

打开靶机 我们先查看页面源代码&#xff0c;发现什么也没有 再去用nmap扫描 nmap -sV -p- 192.168.95.144 发现也没什么用 我们在用dirb扫一下 dirb http://192.168.95.144 我们发现了robots.txt并且响应码是200&#xff0c;去访问一下 又得到了一个目录&#xff0c;去访问…

三层交换原理及图示

大概 三层交换原理 需要提前掌握的&#xff08;VLAN基础知识&#xff09; 【Info-Finder 参考链接&#xff1a;什么是VLAN】 三层是IP层&#xff0c;即网络层。为了方便记忆的&#xff1a;“先有网络&#xff0c;才有传输”、“传输是为了验证有网络”、“IP不是Transfer”…

当AI遇见大数据:决策优化的下一个风口

引言 在信息化时代的浪潮中&#xff0c;数据已成为企业决策的重要资产。随着大数据技术的发展&#xff0c;企业积累了海量的用户行为数据、市场动态和内部运营信息&#xff0c;这些数据背后蕴藏着巨大的价值。然而&#xff0c;数据的价值并非天然显现&#xff0c;它需要通过有效…

sizeof和strlen区分,(好多例子)

sizeof算字节大小 带\0 strlen算字符串长度 \0之前

SmartAIChain荣获重要认可

2024年12月21日&#xff0c;洛杉矶尔湾市——在今年的圣诞艺术交流会上&#xff0c;黄荣先生的SmartAIChain项目获得了重要认可。此次活动汇聚了来自各地的艺术家以及社区代表&#xff0c;共同庆祝这一创新性艺术的时刻。 在活动中&#xff0c;核桃市议员伍立伦(Allen Wu)代表D…

【Compose multiplatform教程12】【组件】Box组件

查看全部组件文章浏览阅读493次&#xff0c;点赞17次&#xff0c;收藏11次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Box 功能说明&#xff1a;简单的布局组件&#xff0c;可容纳其他组件&#xff0c;并依据alignment属性精确指定内部组件的对…

RT-DETR学习笔记(3)

九、损失函数 整理所需参数 decoder的输出结果&#xff1a;6层decoderlayer的类别以及bbox预测 将500个query拆分成300&#xff08;300个query&#xff09;200(denoising query) 1. 最后一层的decoder的输出的300部分&#xff0c;单独存储到out中的"pred_logits"和“…

处理元素卡在视野边界,滚动到视野内

效果图如下&#xff1a; 本示例处理场景&#xff1a;点击底部的折叠面板&#xff0c;展开后移动端滚动条位置不变&#xff0c;导致展开内容在视图外。造成面板展开无内容的错觉。 处理核心API: IntersectionObserver 此API可绑定元素并监听元素是否在视野内。若在视野外​​​…

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署

RAGFlow 基于深度文档理解构建的开源 RAG引擎 - 安装部署 flyfish 1. 确保 vm.max_map_count ≥ 262144 这是指要调整Linux内核参数vm.max_map_count&#xff0c;以确保其值至少为262144。这个参数控制着进程可以映射的最大内存区域数量。对于某些应用程序&#xff08;如Ela…

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现

鸿蒙项目云捐助第二十九讲云捐助项目云数据库商品的批量增加功能实现 关于鸿蒙云捐助项目&#xff0c;前面的内容已使用云函数&#xff0c;云数据库分别实现云捐助项目首页中的项分类导航&#xff0c;底部导航&#xff0c;轮播图功能&#xff0c;这里继续实现云数据库加载捐赠…

Confluent Cloud Kafka 可观测性最佳实践

Confluent Cloud 介绍 Confluent Cloud 是一个完全托管的 Apache Kafka 服务&#xff0c;提供高可用性和可扩展性&#xff0c;旨在简化数据流处理和实时数据集成。用户可以轻松创建和管理 Kafka 集群&#xff0c;而无需担心基础设施的维护和管理。Confluent Cloud 支持多种数据…

SpringCloudAlibaba升级手册-nacos问题记录

目录 一、前言 二、升级过程 1.问题 2.原因 3.出处 4.理论解决 5.测试环境问题 6.Spring Cloud Alibaba版本对比 7. Spring Cloud Alibaba适配组件版本对比 8.降低Spring Cloud版本 9.SpringCloud与SpringBoot兼容对比表 10.naocs-client版本对比 三、最终解决 一…