Springboot使用自带Logback 与 整合log4j 和 log4j2过程详解

logback 

1、添加依赖
  <!--spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
2、logback-spring.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 默认的一些配置 --><include resource="org/springframework/boot/logging/logback/defaults.xml"/><!-- 定义应用名称,区分应用 --><property name="APP_NAME" value="logback-test"/><!-- 定义日志文件的输出路径 --><property name="LOG_PATH" value="E:/activity7/logs/${APP_NAME}"/><!-- 定义日志文件名称和路径 --><property name="LOG_FILE" value="${LOG_PATH}/application.log"/><!-- 定义警告级别日志文件名称和路径 --><property name="WARN_LOG_FILE" value="${LOG_PATH}/warn.log"/><!-- 定义错误级别日志文件名称和路径 --><property name="ERROR_LOG_FILE" value="${LOG_PATH}/error.log"/><!-- 将日志滚动输出到application.log文件中 --><appender name="APPLICATION"class="ch.qos.logback.core.rolling.RollingFileAppender"><!-- 输出文件目的地 --><file>${LOG_FILE}</file><encoder><!-- 使用默认的输出格式打印 --><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder><!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 文件命名格式 --><fileNamePattern>${LOG_FILE}.%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 文件保留最大天数 --><maxHistory>7</maxHistory><!-- 文件大小限制 --><maxFileSize>50MB</maxFileSize><!-- 文件总大小 --><totalSizeCap>500MB</totalSizeCap></rollingPolicy></appender><!-- 摘取出WARN级别日志输出到warn.log中 --><appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${WARN_LOG_FILE}</file><encoder><!-- 使用默认的输出格式打印 --><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder><!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 文件命名格式 --><fileNamePattern>${LOG_PATH}/warn.%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 文件保留最大天数 --><maxHistory>7</maxHistory><!-- 文件大小限制 --><maxFileSize>50MB</maxFileSize><!-- 文件总大小 --><totalSizeCap>500MB</totalSizeCap></rollingPolicy><!-- 日志过滤器,将WARN相关日志过滤出来 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>WARN</level></filter></appender><!-- 摘取出ERROR级别日志输出到error.log中 --><appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${ERROR_LOG_FILE}</file><encoder><!-- 使用默认的输出格式打印 --><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder><!-- 设置 RollingPolicy 属性,用于配置文件大小限制,保留天数、文件名格式 --><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 文件命名格式 --><fileNamePattern>${LOG_PATH}/error.%d{yyyy-MM-dd}.%i.log</fileNamePattern><!-- 文件保留最大天数 --><maxHistory>7</maxHistory><!-- 文件大小限制 --><maxFileSize>50MB</maxFileSize><!-- 文件总大小 --><totalSizeCap>500MB</totalSizeCap></rollingPolicy><!-- 日志过滤器,将ERROR相关日志过滤出来 --><filter class="ch.qos.logback.classic.filter.ThresholdFilter"><level>ERROR</level></filter></appender><!-- 配置控制台输出 --><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- 使用默认的输出格式打印 --><pattern>${CONSOLE_LOG_PATTERN}</pattern><charset>utf8</charset></encoder></appender><!-- 配置输出级别 --><root level="INFO"><!-- 加入控制台输出 --><appender-ref ref="CONSOLE"/><!-- 加入APPLICATION输出 --><appender-ref ref="APPLICATION"/><!-- 加入WARN日志输出 --><appender-ref ref="WARN"/><!-- 加入ERROR日志输出 --><appender-ref ref="ERROR"/></root>
</configuration>
3、使用 
@Controller
@RequestMapping("/modeler")
public class ModelerController {private final Logger log = LoggerFactory.getLogger(ModelerController.class);@AutowiredRepositoryService repositoryService;@ResponseBody@RequestMapping("/my")public String index(){log.error("error");log.warn("warn");log.info("xinxxxxxxx");log.debug("debugger");log.trace("trace");return "my.html";}}

 本地日志:

log4j整合

1、添加依赖

   <!--spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 排除自带的logback依赖 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!--log4j 依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j</artifactId><version>1.3.8.RELEASE</version></dependency>

2、log4j.properties文件配置

#日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL
log4j.rootLogger=info,error,info,warn,stdout
##############打印到平台的日志##################
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#输出的信息格式
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p:%X{traceID}]-(%C:%L) %m%n
##############WARN打印的文件的日志##################
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.tracking.Encoding=utf-8
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p]-(%C:%L) %m%n
#输出文件位置
log4j.appender.warn.File=E:/log4j/warn/warn
log4j.appender.warn.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.warn.Threshold=ALL
##############ERROR打印的文件的日志##################
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p]-(%C:%L) %m%n
log4j.appender.error.File=E:/log4j/error/error
log4j.appender.error.DatePattern='.'yyyy-MM-dd-HH
log4j.appender.error.Threshold=ERROR
##############INFO打印的文件的日志##################cn.com.bluemoon.bd.service.its.deg.common.Log4jMyAppender
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p:%X{traceID}]-(%C:%L) %m%n
#这个相对路径是从当前配置文件的路径开始的
log4j.appender.info.File=E:/log4j/info/info
#DataPattern规定每小时产生一个日志文档,当前小时的文日志会放在名字为info的文档里,以前的日志放在lofo.yyyy-MM-dd-HH的文档里。
log4j.appender.info.DatePattern='.'yyyy-MM-dd-HH-mm
log4j.appender.info.ImmediateFlush=true

 3、配置文件中设置日志

application.yml:

#log4j 日志输出
logging:config:classpath: classpath:log4j.properties #log4j.properties配置文件(log4j后缀为*.properties)  # path 和 name 同时启用,起作用的时namefile:path: E:/LOG4J #设置存储在本地日志路径name: log4j #设置存储在本地日志名称(日志文件默认存储在项目根目录)

4、使用:

@Controller
@RequestMapping("/modeler")
public class ModelerController {private final Logger log = LoggerFactory.getLogger(ModelerController.class);@AutowiredRepositoryService repositoryService;@ResponseBody@RequestMapping("/my")public String index(){log.error("error");log.warn("warn");log.info("xinxxxxxxx");log.debug("debugger");log.trace("trace");return "my.html";}}

log4j2整合

1、添加依赖

 <!--spring boot依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><!-- 排除自带的logback依赖 --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- 引入 log4j2 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>

2、log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->
<configuration status="WARN" monitorInterval="1800"><Properties><!-- 日志默认存放的位置,这里设置为项目根路径下,也可指定绝对路径 --><!--日志路径和名称在**.yml中设置这里无需设置(设置也不起作用)--><!-- <property name="basePath">log4j2Logs</property>--><!-- ${web:rootDir}是web项目根路径,java项目没有这个变量,需要删掉,否则会报异常 --><!-- <property name="basePath">d:/qfxSpringMVCMybaitsDemoLogs</property> --><!-- 控制台默认输出格式,"%-5level":日志级别,"%l":输出完整的错误位置,是小写的L,因为有行号显示,所以影响日志输出的性能 %t 输出产生该日志事件的线程名--><property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS}  %highlight{%-5level %l} -%m%n</property><!-- 日志文件默认输出格式,不带行号输出(行号显示会影响日志输出性能);%C:大写,类名;%M:方法名;%m:错误信息;%n:换行 --><property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M -%m%n</property><!-- 日志默认切割的最小单位 --><property name="every_file_size">20MB</property><!-- 日志默认输出级别 --><property name="output_log_level">DEBUG</property><!-- 日志默认存放路径(所有级别日志) --><property name="rolling_fileName">${basePath}/all.log</property><!-- 日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 --><property name="rolling_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-all.log.zip</property><!-- 日志默认同类型日志,同一文件夹下可以存放的数量,不设置此属性则默认为7个 --><property name="rolling_max">50</property><!-- Info日志默认存放路径(Info级别日志) --><property name="info_fileName">${basePath}/info.log</property><!-- Info日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 --><property name="info_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-info.log.zip</property><!-- Info日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 --><property name="info_max">10</property><!-- Warn日志默认存放路径(Warn级别日志) --><property name="warn_fileName">${basePath}/warn.log</property><!-- Warn日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 --><property name="warn_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-warn.log.zip</property><!-- Warn日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 --><property name="warn_max">10</property><!-- Error日志默认存放路径(Error级别日志) --><property name="error_fileName">${basePath}/error.log</property><!-- Error日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 --><property name="error_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-error.log.zip</property><!-- Error日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 --><property name="error_max">10</property><!-- 控制台显示的日志最低级别 --><property name="console_print_level">DEBUG</property><!-- druid日志默认存放路径(Error级别日志) --><property name="druid_fileName">${basePath}/druid.log</property><!-- druid日志默认压缩路径,将超过指定文件大小的日志,自动存入按"年月"建立的文件夹下面并进行压缩,作为存档 --><property name="druid_filePattern">${basePath}/time-based-logs/%d{yyyy-MM-dd}-druid.log.zip</property><!-- druid日志默认同一文件夹下可以存放的数量,不设置此属性则默认为7个 --><property name="druid_max">10</property></Properties><!--定义appender --><appenders><!-- 用来定义输出到控制台的配置 --><Console name="Console" target="SYSTEM_OUT"><!-- 设置控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) --><ThresholdFilter level="${console_print_level}" onMatch="ACCEPT" onMismatch="DENY"/><!-- 设置输出格式,不设置默认为:%m%n --><PatternLayout pattern="${console_log_pattern}"/></Console><!-- 打印root中指定的level级别以上的日志到文件 --><RollingFile name="RollingFile" fileName="${rolling_fileName}"filePattern="${rolling_filePattern}"><PatternLayout pattern="${log_pattern}"/><Policies><!-- jvm重启就进行一次rollover--><OnStartupTriggeringPolicy /><!-- 文件大小达到20mb进行一次rollover --><SizeBasedTriggeringPolicy size="20 MB" /><!-- TimeBasedTriggeringPolicy是最多用到的Policy,interval默认值是1,根据filePattern中日期的最小单位,例如在该配置里是mm(分钟),设置interval="2"则每隔两分钟将发生一次rollover,按当前配置,具体表现就是隔两分钟得到一个log.zip。modulate就是让第一次rollover发生在区间边界上(即便还没到interval的时长),按照当前配置,首次rollover会发生在比如8点50分0秒,这样之后的rollover就是8点52分0秒、8点54分0秒..这样做的好处在于rollover的时机就变得很有规律很好预测,生成的文件还很整齐(假设时间最小单位为天,interval="1",那么就变成稳定每天0点自动rollover了。。)。还有个属性叫maxRandomDelay,防止很多应用在同一时间一起rollover的,暂时不理它。--><TimeBasedTriggeringPolicy interval="1" modulate="true" /><!-- DefaultRolloverStrategy,默认rollover策略。参数:fileIndex有两个值,max和min,就是决定生成文件是从序号大的到序号小的,还是从序号小的到序号大。min,计数器的起始值,默认是1;max,计数器的最大值,默认是7。还有两个参数暂时不管。--><DefaultRolloverStrategy max="${info_max}"><Delete basePath="${basePath}/time-based-logs/" maxDepth="2"><IfFileName glob="*.log.zip" /><!--!Note: 这里的age必须和filePattern协调, 后者是精确到HH, 这里就要写成xH, xd就不起作用另外, 数字最好>2, 否则可能造成删除的时候, 最近的文件还处于被占用状态,导致删除不成功!--><!--7天--><!--<IfLastModified age="168H" />--><!--1个月--><IfLastModified age="720H" /></Delete></DefaultRolloverStrategy></Policies></RollingFile><!-- 打印INFO级别的日志到文件 --><RollingFile name="InfoFile" fileName="${info_fileName}"filePattern="${info_filePattern}"><PatternLayout pattern="${log_pattern}"/><!-- 匹配INFO级别 --><Filters><ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/><ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/></Filters><Policies><!-- jvm重启就进行一次rollover--><OnStartupTriggeringPolicy /><!-- 文件大小达到20mb进行一次rollover --><SizeBasedTriggeringPolicy size="${every_file_size}" /><TimeBasedTriggeringPolicy interval="1" modulate="true" /><DefaultRolloverStrategy max="${info_max}"/></Policies></RollingFile><!-- 打印WARN级别的日志到文件 --><RollingFile name="WarnFile" fileName="${warn_fileName}"filePattern="${warn_filePattern}"><PatternLayout pattern="${log_pattern}"/><!-- 匹配WARN级别 --><Filters><ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/><ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/></Filters><Policies><!-- jvm重启就进行一次rollover--><OnStartupTriggeringPolicy /><!-- 文件大小达到20mb进行一次rollover --><SizeBasedTriggeringPolicy size="${every_file_size}" /><TimeBasedTriggeringPolicy interval="1" modulate="true" /><DefaultRolloverStrategy max="${info_max}"/></Policies></RollingFile><!-- 打印ERROR级别的日志到文件 --><RollingFile name="ErrorFile" fileName="${error_fileName}"filePattern="${error_filePattern}"><PatternLayout pattern="${log_pattern}"/><!-- 匹配ERROR级别 --><Filters><ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/><ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/></Filters><Policies><!-- jvm重启就进行一次rollover--><OnStartupTriggeringPolicy /><!-- 文件大小达到20mb进行一次rollover --><SizeBasedTriggeringPolicy size="${every_file_size}" /><TimeBasedTriggeringPolicy interval="1" modulate="true" /><DefaultRolloverStrategy max="${info_max}"/></Policies></RollingFile><!--druid的日志记录追加器--><RollingFile name="druidSqlRollingFile" fileName="${druid_fileName}"filePattern="${druid_filePattern}"><PatternLayout pattern="${druid_pattern}"/><Policies><!-- jvm重启就进行一次rollover--><OnStartupTriggeringPolicy /><!-- 文件大小达到20mb进行一次rollover --><SizeBasedTriggeringPolicy size="${every_file_size}" /><TimeBasedTriggeringPolicy interval="1" modulate="true" /><DefaultRolloverStrategy max="${info_max}"/></Policies></RollingFile></appenders><!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 --><loggers><!--log4j2 自带过滤日志--><Logger name="org.apache.catalina.startup.DigesterFactory" level="error" /><Logger name="org.apache.catalina.util.LifecycleBase" level="error" /><Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn" /><logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/><Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn" /><Logger name="org.crsh.plugin" level="warn" /><logger name="org.crsh.ssh" level="warn"/><Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error" /><Logger name="org.hibernate.validator.internal.util.Version" level="warn" /><logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/><logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/><logger name="org.thymeleaf" level="warn"/><!-- 设置对打印sql语句的支持 --><logger name="java.sql" level="debug" additivity="false"><appender-ref ref="Console"/></logger><!--记录druid-sql的记录--><logger name="druid.sql.Statement" level="debug" additivity="false"><appender-ref ref="druidSqlRollingFile"/></logger><!--建立一个默认的root的logger --><root level="${output_log_level}"><appender-ref ref="RollingFile"/><appender-ref ref="Console"/><appender-ref ref="InfoFile"/><appender-ref ref="WarnFile"/><appender-ref ref="ErrorFile"/></root></loggers>
</configuration>

3、配置文件中设置日志

application.yml

#log4j2 日志输出
logging:config:classpath: classpath:log4j2.xml #log4j2配置文件(log4j2后缀为*.xml/*.json)# path 和 name 同时启用,起作用的时namefile:path: E:/LOG4J2 #设置存储在本地日志路径name: log4j2 #设置存储在本地日志名称(日志文件默认存储在项目根目录)

4、使用:

@Controller
@RequestMapping("/modeler")
public class ModelerController {private final Logger log = LoggerFactory.getLogger(ModelerController.class);@AutowiredRepositoryService repositoryService;@ResponseBody@RequestMapping("/my")public String index(){log.error("error");log.warn("warn");log.info("xinxxxxxxx");log.debug("debugger");log.trace("trace");return "my.html";}}

注意:如果pom.xml中添加有 spring-boot-starter-test 依赖

必须写成如下,否则爆提示包冲突错误

        

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

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

相关文章

个人事务备忘录管理微信小程序

介绍 UniApp是一款使用Vue.js开发所有前端应用的框架&#xff0c;能够同时在iOS、Android、H5、小程序等多个平台上运行&#xff1b;所以本系统可以是一个安卓app&#xff0c;也可以是微信小程序 系统包括以下功能&#xff1a; 备忘录 管理个人事务 记事本 事务分类 日记编写…

全网第一篇教你怎么总结多线程知识

于「全景图」&#xff0c;我之前也有一直在构建&#xff0c;可是因为知识储备不够&#xff0c;确实很难构建出来。稍微了解过并发领域知识的人都知道&#xff0c;里面的知识点、概念多而散&#xff1a;线程安全、锁、同步、异步、阻塞、非阻塞、死锁、队列(为什么并发要跟队列扯…

安卓Android Studio读写MifareOne M1 IC卡源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c-s.w4002-21818769070.11.66af789eLeok2R <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout …

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于CPO-BP基于冠豪猪算法优化BP神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.CPO-BP回归基于冠豪猪优化算法[24年新…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子详情实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【排序算法】三、选择排序(C/C++)

「前言」文章内容是排序算法之选择排序的讲解。&#xff08;所有文章已经分类好&#xff0c;放心食用&#xff09; 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 选择排序1.1 原理1.2 代码实现&#xff08;C/C&#xff09;1.3 优化1.3 特性总结 选择排…

Unity Meta Quest 一体机开发(十三):【手势追踪】自定义交互事件 EventWrapper

文章目录 &#x1f4d5;教程说明&#x1f4d5;交互事件概述&#x1f4d5;自定义交互逻辑⭐方法一&#xff1a;Inspector 面板赋值⭐方法二&#xff1a;纯代码处理 此教程相关的详细教案&#xff0c;文档&#xff0c;思维导图和工程文件会放入 Spatial XR 社区。这是一个高质量…

cuda12.0 安装 pytorch

前两天买的y7000p到了&#xff0c;然后就要重新配下环境。 流程如下 首先下载miniconda &#xff0c;我下的是python3.8的创建自己的自定义环境检查自己的cuda版本&#xff0c;我的是cuda:12.0然后再pytorch上找到对应cuda版本的进行下载&#xff0c;pip install或者conda in…

工作每天都在用的 DNS 协议,你真的了解么?

我们经常访问一些网址的时候&#xff0c;浏览器里输入类似于 www.baidu.com 这样的地址&#xff0c;那么在浏览器里输入这个地址---> 百度服务器给我们返回这个百度的页面&#xff0c;中间的过程是什么样的呢&#xff1f; 带着这个问题&#xff0c;我们一起来解析一下其中的…

Domino自带应用免费开源,免费共享

大家好&#xff0c;才是真的好。 作为一个强大的、综合性的、高安全的企业级应用平台&#xff0c;Domino同时也拥有业界首屈一指的应用程序开发能力。不过&#xff0c;让Domino有强大竞争力的&#xff0c;也应该包含它自带的数十个开箱即用的Notes应用程序。 我在前面很多篇幅…

2024年人工智能有哪些证书可以报考呢?

由国家工信部权威认证的人工智能证书是跨入人工智能行业的敲门砖&#xff0c;随着人工智能技术的发展越来越成熟&#xff0c;相关的从业人员也会剧增&#xff0c;证书的考取难度也会变高。如果已经从事或者准备从事人工智能行业的人员&#xff0c;对于考证宜早不宜迟&#xff0…

数据库软件详解一

MySQL 的安装 MySQL 的安装可去参考下这篇文章&#xff0c;比较详细&#xff0c;在此就不多啰嗦了&#xff01; MySQL 的卸载 如果你并不是第一次安装 MySQL &#xff0c;或者安装 MySQL 不对&#xff0c;需要将 MySQL 卸载干净才能将下一个版本的 MySQL 安装成功 卸载步骤 …

Javaweb之SpringBootWeb案例开发规范的详细解析

1.2 开发规范 了解完需求也完成了环境搭建了&#xff0c;我们下面开始学习开发的一些规范。 开发规范我们主要从以下几方面介绍&#xff1a; 1、开发规范-REST 我们的案例是基于当前最为主流的前后端分离模式进行开发。 在前后端分离的开发模式中&#xff0c;前后端开发人员…

uniapp 设置底部导航栏

uniapp 设置原生 tabBar 底部导航栏。 设置底部导航栏 一、创建页面&#xff0c;一定要在 pages.json 文件中注册。 二、在 pages.json 文件中&#xff0c;设置 tabBar 配置项。 pages.json 页面 {"pages": [...],"globalStyle": {...},"uniIdRout…

Flex布局--常用好用

1.什么是Flex布局&#xff1f; flex 是 flexible Box 的缩写&#xff0c;意为"弹性布局"&#xff0c;用来为盒状模型提供最大的灵活性&#xff0c;任何一个容器都可以 指定为 flex 布局。 当我们为父盒子设为 flex 布局以后&#xff0c;子元素的 float、clear 和 ve…

地推拉新任务管理助手程序开发

拉新地推任务管理分销助手程序开发&#xff0c;旨在为企业提供一套专业、高效的管理工具&#xff0c;以优化地推任务分配、提高销售业绩。 以下是该程序的核心功能说明&#xff1a; 任务管理模块&#xff1a;允许管理员创建、分配和管理地推任务。管理员能够精确地指派任务给…

[Android自定义View]实现一个环形进度条控件

[Android View]实现一个环形进度条 导言 之前的文章里我们已经介绍了自定义View相关的知识了&#xff0c;本篇文章我们就来实战一下&#xff0c;从零到一&#xff0c;实现一个环形进度条的控件。 具体实现 大体框架 我们说过&#xff0c;如果要实现一个自定义控件的话一般有…

JavaScript系列——Promise

文章目录 概要Promise三种状态状态改变Promise链式调用Promise处理并发promise.all()promise.allSettled&#xff08;&#xff09;Promise.any()promise.race() 小结 概要 Promise中文翻译过来就是承诺、预示、有可能的意思。 在JavaScript里面&#xff0c;Promise 是一个对象…

软件测试|解析selenium.common.exceptions.ElementClickInterceptedException错误及解决方法

导言 在自动化测试中&#xff0c;Selenium是一个广泛使用的工具&#xff0c;用于模拟用户在网页上的操作。然而&#xff0c;有时候在执行点击操作时&#xff0c;可能会遇到ElementClickInterceptedException异常&#xff0c;这可能是由于多种原因导致的。本文将深入探讨这个错…

【算法练习】leetcode算法题合集之数组和哈希表篇

重建数组&#xff08;高频&#xff09; LeetCode283.移动零 LeetCode283.移动零 双指针&#xff0c;记录已经处理好的序列的尾部 class Solution {public void moveZeroes(int[] nums) {int k 0;for (int i 0; i < nums.length; i) {if (nums[i] ! 0) {swap(nums, i, k)…