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

logback/log4j基本配置和标签详解

什么是logback

logback 继承自 log4j,它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小,包含了许多独特并且有用的特性。

logback.xml

首先直接上配置,我在项目过程中发现一些同时遇到需要logback文件的时候就去其他项目copy一个,改吧改吧名字就直接完事。完全不了解其中标签的含义以及需要单独将日志打入一个文件怎么使用都不清楚,如果你需要一个logback可以把底下的copy走,但是我建议看看后续的标签含义。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 每隔20S扫描1次配置文件,如果配置文件被修改自动加载 -->
<configuration scan="true" scanPeriod="20 seconds"><!-- Windows操作系统 --><if condition='property("os.name").contains("Windows")'><then><property name="LOG_FILE_ROOT" value="D://opt/applog/logs"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></then></if><!-- MAC操作系统 --><if condition='property("os.name").toUpperCase().contains("MAC")'><then><property name="LOG_FILE_ROOT" value=".log/logs" /><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></then></if><!-- Linux操作系统 --><if condition='property("os.name").contains("Linux")'><then><property name="LOG_FILE_ROOT" value="/opt/applog/-logs"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></then></if><springProfile name="dev"><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-debug.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-debug-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>7</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></springProfile><!-- 时间滚动输出 level为 INFO 日志 --><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-info.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>20</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!-- 时间滚动输出 level为 WARN 日志 --><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-warn.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-warn-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>7</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!-- 时间滚动输出 level为 ERROR 日志 --><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-error.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!-- root Logger 分环境进行配置,本地环境需要用的DEBUG --><springProfile name="dev"><root level="DEBUG"><appender-ref ref="STDOUT"/><appender-ref ref="DEBUG"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="ERROR"/></root></springProfile><springProfile name="pro"><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="ERROR"/></root></springProfile></configuration>

<root>标签

在 Logback 日志框架中,<root level> 标签用于定义根日志级别。根日志级别是指所有日志记录器的默认级别,如果没有为特定的日志记录器指定级别,则会使用根日志级别。

根日志级别通过<root> 元素来表示,其语法如下:

<root level="级别"><!-- appender 配置 -->
</root>

在这里插入图片描述

在这里,level 属性用于指定根日志级别。根日志级别可以是以下之一:TRACE、DEBUG、INFO、WARN、ERROR 或 OFF。级别由低到高,TRACE 是最详细的级别,而 OFF 表示禁用日志记录。

当一个日志事件发送到 Logback 时,它将首先检查根日志级别。如果事件的级别高于或等于根日志级别,那么该事件将被记录下来。如果事件的级别低于根日志级别,那么它将被忽略。

因此,通过设置 <root level> 标签,您可以为整个应用程序指定默认的日志记录级别。您还可以在其他地方针对特定的日志记录器设置级别,以覆盖根日志级别的默认设置。

<appender-ref>标签

<appender-ref> 标签用于将日志事件附加器(appender)与特定的日志记录器相关联。在 Logback 配置文件中,可以使用 <appender-ref> 标签将一个或多个附加器与日志记录器关联起来。

<appender-ref> 元素的语法如下:

<appender-ref ref="附加器名称" />

在这里,ref 属性用于指定要关联的附加器的名称。附加器名称应与配置文件中定义的附加器的名称匹配。

通过使用 <appender-ref> 标签,您可以将一个或多个附加器(例如文件附加器、控制台附加器等)与日志记录器相关联。这意味着当日志事件到达该日志记录器时,它将被传递给与之关联的附加器进行处理。这样可以根据需要将日志事件输出到不同的目标,例如文件、控制台、远程服务器等。

以下是一个示例,展示如何使用 <appender-ref> 标签将附加器与日志记录器关联:

<configuration><!-- 定义附加器 --><appender name="ConsoleAppender" class="ch.qos.logback.core.ConsoleAppender"><!-- 附加器配置 --></appender><!-- 定义日志记录器 --><logger name="com.example.MyClass" level="DEBUG"><!-- 关联附加器 --><appender-ref ref="ConsoleAppender" /></logger>
</configuration>

在上面的示例中,ConsoleAppender 是一个控制台附加器,它被定义在 <appender> 元素中。然后,通过使用 <appender-ref> 标签,将该附加器与名为 com.example.MyClass 的日志记录器关联起来。这意味着 com.example.MyClass 日志记录器的日志事件将被发送到 ConsoleAppender 进行处理。

通过适当配置 <appender-ref> 标签,您可以将多个附加器关联到同一个日志记录器,或者将同一个附加器关联到多个日志记录器,以满足您的日志输出需求。

简单的说:上述的示例就可以为我们输出日志到自定义的文件夹中。

输出日志到自定义文件

在开发的过程中,难免会要在info日志和error日志中排查问题,那么一个应用部署在测试环境或者uat环境的时候,会产生大量的日志在日志文件中,如果我们需要查询相关的日志记录通常linux会使用grep来进行搜索来满足需求。如果你的功能会被大量调用,并且需要详细记录前后流转的参数;又或者在测试阶段需要把用户所有的权限和角色在日志文件中打印观察。此时你可能需要把你这部分的功能开发日志打印到一个单独的日志文件中。

<!-- root Logger 分环境进行配置,本地环境需要用的DEBUG --><springProfile name="dev"><root level="DEBUG"><appender-ref ref="STDOUT"/><appender-ref ref="DEBUG"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="ERROR"/></root></springProfile><springProfile name="pro"><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="ERROR"/></root></springProfile>

根据springProfile标签,我们可以分环境配置,dev环境的root级别改为DEBUG级别,pro环境使用INFO级别。所以如果你需要观察用户权限问题打的日志可以使用log.debug()来记录在debug的日志文件中。

那么如果想要新建一个日志文件(非info、error、warn、debug)的日志,例如支付相关的日志都放入paylog文件中。不管是DEBUG INFO WARN ERROR都直接放一起,那么我们需要自定义一个附加器appender和一个日志记录器logger。

附加器定义如下:

<appender name="pay" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/qhyu.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/qhyu-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>20</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender>

在 Logback 的过滤器配置中,<onMatch><onMismatch> 标签用于指定过滤器匹配和不匹配时的行为。它们需要配套使用。

  • <onMatch>:该标签定义了当日志事件与过滤器匹配时的操作。它有以下参数:

    • ACCEPT:表示接受(通过)匹配的日志事件,将其传递给后续的附加器或日志记录器进行处理。

    • NEUTRAL:表示中立,不对匹配的日志事件进行特殊处理,继续按照日志处理流程进行传递。

    • DENY:表示拒绝(拦截)匹配的日志事件,不将其传递给后续的附加器或日志记录器。

  • <onMismatch>:该标签定义了当日志事件与过滤器不匹配时的操作。它有以下参数:

  • ACCEPT:表示接受(通过)不匹配的日志事件,将其传递给后续的附加器或日志记录器进行处理。

  • NEUTRAL:表示中立,不对不匹配的日志事件进行特殊处理,继续按照日志处理流程进行传递。

  • DENY:表示拒绝(拦截)不匹配的日志事件,不将其传递给后续的附加器或日志记录器。

通常情况下,应该将 <onMatch><onMismatch> 标签配对使用,以明确指定匹配和不匹配时的操作。例如,可以将匹配时的操作设置为 ACCEPT,表示允许通过匹配的日志事件,而将不匹配时的操作设置为 DENY,表示拒绝不匹配的日志事件。

以下是一个示例配置:

<filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch>
</filter>

在上述示例中,过滤器的配置指定了当日志事件的级别为 INFO 时,执行匹配操作为 ACCEPT,而当日志事件的级别不是 INFO 时,执行不匹配操作为 DENY。这意味着只有级别为 INFO 的日志事件才会通过过滤器,其他级别的日志事件将被拒绝。

因为我想把所有的日志都打到一个文件中,不区分info error还是warn所以我将四个过滤器放在同一个附加器中,如果你想为这个文件拆分的话可以配合日志记录器一起使用,也就是接下来要说的内容。

日志记录器如下:

<logger name="PAYLOGGER" level="DEBUG" additivity="false"><appender-ref ref="pay"/></logger>

在这里插入图片描述

如果使用的是自定义name,那么自己使用的时候需要定义Logger logger = LoggerFactory.getLogger(“PAYLOGGER”);这样可以在任意的类中直接使用。

<logger> 标签用于配置特定包或类的日志记录器。它允许您为特定的包或类设置不同于根日志记录器的日志级别、附加器和其他属性。

<logger> 标签有以下常用的属性:

  • name:指定要配置的包或类的名称。可以使用包名或类的全限定名。例如,com.swcares.eupsi.airplaneSale

  • level:设置该日志记录器的日志级别。可以是 TRACEDEBUGINFOWARNERROR 等级别。例如,INFO

  • additivity:指定是否继承父级日志记录器的附加器。如果设置为 true,则该日志记录器将继承父级日志记录器的附加器;如果设置为 false,则该日志记录器将仅使用自己配置的附加器。默认值为 true

除了上述常用属性外,<logger> 标签还可以配置其他属性,如 <appender-ref> 标签引用的附加器、<filter> 标签设置的过滤器等。这些属性可以根据您的需求进行配置和调整。

以下是一个示例 <logger> 标签的配置:

<logger name="com.qhyu.pay.modules.test" level="INFO" additivity="false"><appender-ref ref="SOME_APPENDER"/>
</logger>

在上述示例中,<logger> 标签配置了名为 com.qhyu.pay.modules.test 的日志记录器,将日志级别设置为 INFO,并指定了一个名为 SOME_APPENDER 的附加器。此外,additivity 属性被设置为 false,表示该日志记录器不会继承父级日志记录器的附加器。

这种配置就是可以在这个类中直接使用,不需要定义Logger了。

在这里插入图片描述

通过使用 <logger> 标签,您可以对特定的包或类进行精细化的日志配置,以满足不同部分的日志记录需求。

完整xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 每隔20S扫描1次配置文件,如果配置文件被修改自动加载 -->
<configuration scan="true" scanPeriod="20 seconds"><!-- Windows操作系统 --><if condition='property("os.name").contains("Windows")'><then><property name="LOG_FILE_ROOT" value="D://opt/applog/logs"/><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></then></if><!-- MAC操作系统 --><if condition='property("os.name").toUpperCase().contains("MAC")'><then><property name="LOG_FILE_ROOT" value=".log/logs"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></then></if><!-- Linux操作系统 --><if condition='property("os.name").contains("Linux")'><then><property name="LOG_FILE_ROOT" value="/opt/applog/-logs"/><!-- 控制台输出 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></then></if><springProfile name="dev"><appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-debug.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-debug-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>7</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender></springProfile><!-- 时间滚动输出 level为 INFO 日志 --><appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-info.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-info-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>20</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!-- 时间滚动输出 level为 INFO 日志 --><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-warn.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-warn-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>7</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!-- 时间滚动输出 level为 ERROR 日志 --><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/web-error.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/web-error-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>30</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!-- 时间滚动输出 所有级别的日志到预计的文件中 --><appender name="pay" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_FILE_ROOT}/pay.log</file><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>DEBUG</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>INFO</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>WARN</level><onMatch>ACCEPT</onMatch><onMismatch>NEUTRAL</onMismatch></filter><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>ERROR</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><fileNamePattern>${LOG_FILE_ROOT}/pay-%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern><maxFileSize>100MB</maxFileSize><maxHistory>20</maxHistory><cleanHistoryOnStart>true</cleanHistoryOnStart></rollingPolicy><encoder><pattern>%date{yyyy-MM-dd HH:mm:ss.SSS}[%level][%thread][%logger.java:%line] - %msg%n</pattern></encoder></appender><!--<logger name="com.qhyu.pay.modules.test" level="DEBUG" additivity="false"><appender-ref ref="pay"/></logger>--><logger name="PAYLOGGER" level="DEBUG" additivity="false"><appender-ref ref="pay"/></logger><!-- root Logger 分环境进行配置,本地环境需要用的DEBUG --><springProfile name="dev"><root level="DEBUG"><appender-ref ref="STDOUT"/><appender-ref ref="DEBUG"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="ERROR"/></root></springProfile><springProfile name="pro"><root level="INFO"><appender-ref ref="STDOUT"/><appender-ref ref="INFO"/><appender-ref ref="WARN"/><appender-ref ref="ERROR"/></root></springProfile>
</configuration>

相关文章:

logback/log4j基本配置和标签详解

什么是logback logback 继承自 log4j&#xff0c;它建立在有十年工业经验的日志系统之上。它比其它所有的日志系统更快并且更小&#xff0c;包含了许多独特并且有用的特性。 logback.xml 首先直接上配置&#xff0c;我在项目过程中发现一些同时遇到需要logback文件的时候就去…...

雅思 《九分达人》阅读练习(二)

目录 雅思阅读练习 《九分达人》test3 paragraph3 1.单词含义要记准确&#xff0c;敏感度要上来。 2.找准定位&#xff0c;之后理解句子大致含义。 说说关于判断题的做题方法 关于“承认”有哪些单词 同替词汇 think 可以用什么其他单词来替换 单词 一些疑问 I have…...

[论文笔记] Gunrock: A High-Performance Graph Processing Library on the GPU

Gunrock: A High-Performance Graph Processing Library on the GPU Gunrock: GPU 上的高性能图处理库 [Paper] [Code] PPoPP’16 摘要 Gunrock, 针对 GPU 的高层次批量同步图处理系统. 采用了一种新方法抽象 GPU 图分析: 实现了以数据为中心(data-centric)的抽象, 以在结点…...

A Guide to PriorityQueue

原文链接&#xff1a;https://blog.csdn.net/ohwang/article/details/116934308 PriorityQueue 又叫 优先队列 注意1&#xff1a; PriorityQueue是用数组实现&#xff0c;数组大小可以动态增加&#xff0c;容量无限。 优先队列采用的是堆排序&#xff08;默认为最小堆&#xff…...

Jenkins教程—构建多分支流水线项目

本教程向你展示如何使用Jenkins协调一个用 Node Package Manager (npm) 管理的简单 Node.js 和 React 项目&#xff0c; 并同时 为开发和产品环境交付不同的结果。 在开始本教程之前&#xff0c;建议你前往 教程概览 页面&#xff0c;并至少完成一个 介绍教程&#xff0c; 从而…...

【vxe-table】@enter.keyup.native实现在列表中回车光标向右移动聚焦及vxe-table的一些方法的使用(具体实现+踩坑篇)

需求&#xff1a; vxe-table表格 1、新增的时候&#xff0c;vxe-table第一行的第一个输入框聚焦 2、输入完成后&#xff0c;按回车&#xff0c;自动跳到同一行的下一个输入框 3、当在同一行的最后一个输入框输入完成后&#xff0c;按回车跳回第一个输入框并选中状态且复选框为选…...

科技资讯|苹果Vision Pro获得被动冷却系统及数字表冠控制界面专利

据patentlyapple报道&#xff0c;美国专利商标局正式授予苹果一项与头戴式设备&#xff08;Apple Vision Pro&#xff09;相关的专利11751366&#xff0c;该设备可以提供被动冷却系统&#xff0c;利用光学组件的表面来管理热量&#xff0c;而不会对用户显示的视觉信息产生不利影…...

【悬溺】Flyway的纯爱时刻

文章目录 文档背景你好Demo地址Flyway的CPU时刻&#xff08;工作流程&#xff09;她在哪Flyway的使用流程官方文档 文档背景 由于维护项目的哥们们技术水平参差不齐&#xff0c;长短不一。故做此篇文章。多点纯爱&#xff0c;这个世界需要纯爱战士! 你好 Flyway是一款开源的数据…...

Linux权限介绍

引言 Linux中有两种用户&#xff1a;超级用户&#xff08;root&#xff09;、普通用户 超级用户&#xff1a;在Linux中能做任何事&#xff0c;不受到权限的限制普通用户&#xff1a;会受到权限的限制超级用户的命令提示符是#&#xff0c;普通用户的命令提示符是$ 命令&#xff…...

git:一个本地仓库绑定多个远程的方法以及遇到的问题

绑定方法见知乎大佬&#xff1a;本地Git仓库关联多个远程仓库的两种方法 一般情况下&#xff0c;没人这么搞&#xff01; 但是公司迁移git仓库阶段&#xff0c;xx云环境上的gitlab要有操作记录&#xff0c;不然影响整体评分&#xff0c;这就不得一个本地仓库关联了原来的仓库新…...

如何将WPS设置为默认的办公软件

很多小伙伴的电脑中有好几种办公软件&#xff0c;每次打开文档表格都要进行选择&#xff0c;有小伙伴想要将WPS设置成默认的办公软件该怎么操作呢&#xff0c;下面小编就给大家详细介绍一下将WPS设置为默认的办公软件的方法&#xff0c;有需要的小伙伴快来和小编一起看一看吧。…...

css 文本溢出隐藏,显示省略号

单行隐藏 overflow:hidden; //超出的文本隐藏text-overflow:ellipsis; //溢出用省略号显示white-space:nowrap; //溢出不换行多行隐藏 overflow:hidden; text-overflow:ellipsis; display:-webkit-box; //将对象作为弹性伸缩盒子模型显示。 -webkit-box-orient:vertical; //从…...

构建普适通用的企业网络安全体系框架

在当今数字化时代&#xff0c;网络安全已成为企业保护信息资产和业务运行的重要任务。恶意攻击、数据泄露、网络病毒等威胁不断演进&#xff0c;给企业和个人带来了巨大风险。为了应对这一挑战&#xff0c;许多企业已经采取了一系列网络安全措施&#xff0c;如制定了网络安全政…...

TinTin Web3 动态精选:以太坊基金会推出 EELS、Arbitrum Stylus 上线

TinTin 快讯由 TinTinLand 开发者技术社区打造&#xff0c;旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位&#xff0c; 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态&#xff0c;将有助于 TinTinLand 社区的开…...

软考高级架构师下篇-14面向服务架构设计理论

目录 1. 引言2. SOA的相关概念3. SOA的发展历史4. SOA的参考架构5. SOA 主要协议和规范6. SOA设计的标准要求7. SOA的作用与设计原则8. SOA的设计模式9. SOA构建与实施10. 前文回顾1. 引言 在面向服务的体系结构(Service-Oriented Architecture,SOA)中,服务的概念有了延伸…...

HTTP 和 HTTPS

一.HTTP HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在网络上传输超文本&#xff08;Hypertext&#xff09;和其他资源的应用层协议。HTTP是Web中最常用的协议之一&#xff0c;它使得浏览器可以请求和显示网页&#xff0c;也允许服务器传送网页内容和其…...

linux使用stress命令进行压力测试cpu

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…...

创建vue3项目并引用elementui

1.创建vu3项目&#xff1a; vue3官网&#xff1a;简介 | Vue.js 执行命令 npm create vuelatest 2.终端会出现如下选项&#xff0c;不确定的直接enter键进入下一步&#xff1b; 3.然后再执行下方命令&#xff1a; cd <your-project-name> npm install4.安装依赖成功…...

《C++ Primer》第2章 变量(二)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 2.4 const限定符&#xff08;P53&#xff09; 由于 const 对象在创建后不能修改&#xff0c;所以其必须初始化。 const 对象的常量特征仅在执行改变该变量的操作时才会发生作用。 const 对象默认仅在文件…...

Vue3统一导出局部组件和全局组件

局部组件统一导出 components新增ComponentA.vue、ComponentB.vue两个组件 新增index.js进行组件统一导入 import ComponentA from ./ComponentA.vue import ComponentB from ./ComponentB.vueexport {ComponentA,ComponentB }使用 <template><ComponentA /><…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...