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

springboot整合log4j2日志框架1

目录

一  log4j基本知识

1.1 log4j的日志级别

1.2 log4j的日志文件结构*

1.2.1 概述

1.2.2 详解

1.3 log4j的日志格式化api

1.3.1 api详解

1.3.2 演示案例

 1.3.3 演示案例

1.4 log4j中onmatch和onmismatch的区别*

1.4.1 案例

1.4.2 onmatch的api

1.5 logback,log4j2和slf4j的区别

1.6 log4j2的异常日志格式配置

1.7 log4j2的异步日志配置

1.8 log4j2的日志滚动和过期策略配置

1.9 log4j2设置颜色

1.9.1 设置颜色

1.9.2 设置颜色方式

1.9.3 设置颜色案例

1.10 log4j2的配置使用

1.11 log4j2中includeLocation=true

1.12 log4j2中日志格式化和日志分片

1.13 log4j2中排除包和依赖包


一  log4j基本知识

1.1 log4j的日志级别

Log4j定义了8个级别的log(除去OFF和ALL,可以说分为6个级别),优先级依次为:All,trace,debug,info,warn,error,fatal,off。

当日志级别设置为某个值的时候,低于它的日志信息将不会被记录,只有高于设置的级别的信息会被记录。

【ALL】:最低等级的,用于打开所有日志记录。

【Trace】:很低日志级别,一般很少使用

【Debug】:debug级别的主要输出调试性质的内容,该级别日志主要用于在开发、测试阶段输出,该级别的日志应尽可能地详尽,便于在开发、测试阶段出现问题或者异常时,对齐进行分析。

【Info】:INFO日志主要记录系统关键信息,旨在保留系统正常工作期间关键运行指标,开发人员可以将初始化系统配置、业务状态变化信息,或者用户业务流程中的核心处理记录到INFO日志中,方便日常运维工作以及错误回溯时上下文场景复现。建议在项目完成后,在测试环境将日志级别调成 INFO,然后通过 INFO 级别的信息看看是否能了解这个应用的运用情况,如果出现问题后是否这些日志能否提供有用的排查问题的信息。

【warn】:warn级别的主要输出警告性质的内容,这些内容是可以预知且是有规划的,比如,某个方法入参为空或者该参数的值不满足运行该方法的条件时,在warn级别时应输出较为详尽的信息,以便于事后对日志进行分析。

【error】:error级别主要对于一些不可预知的信息,如,错误,异常等,比如,在catch快中捕获的网络通信,数据库连接等异常,如果异常对系统的整个流程影响不大,可以使用warn级别日志输出。在输出error级别的日志时,尽量多地输出方法入参数、方法执行过程中产生的对象等数据,在带有错误、异常对象的数据时,需要将该对象一并输出。

【fatal】:指出每个严重的错误事件,将会导致应用程序的退出,这个级别比较高了。重大错误,这种级别你可以直接停止程序了。【1】https://blog.csdn.net/wsskl/article/details/137580290

【OFF】:最高等级的,用于关闭所有日志记录。

1.2 log4j的日志文件结构*

1.2.1 概述

Log4j的日志文件主要结构:Loggers(记录器),Appenders (输出源)和Layouts(布局)。这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出

1.properties: 定义一些变量,如日志格式,路径等。

2.Appenders:定义日志输出的目标位置,如控制台,文件等。

3.Loggers:定义日志记录器,控制日志的输出级别和目标。

4.filters:定义过滤条件,控制日志输出。

其中<configuration>标签的status属性用于设置log4j2自身jar里代码的日志输出级别。将status设置为debug可以获得更详细的内部日志输出,这对于调试和问题排查非常有帮助。

5.完整的结构

1.2.2 详解

Loggers(记录器):Loggers组件被分为7个级别,优先级从低到高:all、debug、info、warn、error、fatal、off。任何一个级别只输出本级别以及它级别以上的级别内容。

Appends(输出源):Log4j允许把日志输出到不同的地方,如控制台(Console)、文件(Files)等。

Layout(布局):Layout的作用是控制Log信息的输出方式,也就是格式化输出的信息。

1根节点Configuration有两个属性status和monitorinterval,有两个子节点:Appenders和Loggers(表明可以定义多个 Appender和Logger):

status用来指定log4j本身的打印日志的级别。

monitorinterval用于指定log4j自动重新配置的监测间隔时间,单位是s,最小是5s

2.Appenders节点,常见的有三种子节点:Console、RollingFile、File:

1)Console节点用来定义输出到控制台的Appender

   name:指定 Appender 的名字

   target:SYSTEM_OUT 或SYSTEM_ERR,一般只设置默认:SYSTEM_OUT

   PatternLayout:输出格式,不设置默认为%m%n

2)File节点用来定义输出到指定位置的文件的Appender

    name:指定Appender的名字

    fileName:指定输出日志的目的文件带全路径的文件名

    PatternLayout:输出格式,不设置默认为%m%n

3)RollingFile节点用来定义超过指定大小自动删除旧的创建新的的Appender

name:指定Appender的名字

fileName:指定输出日志的目的文件带全路径的文件名

PatternLayout:输出格式,不设置默认为%m%n

filePattern:指定新建日志文件的名称格式

Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志

TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am

SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size 属性用来定义每个日志文件的大小。

DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。

3.Loggers节点,常见的有两种Root和Logger:

1)root节点用来指定项目的根日志,如果没有单独指定 Logger,那么就会默认使用该 Root日志输出

level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

AppenderRef:Root的子节点,用来指定该日志输出到哪个Appender子节点的ref属性也就是前面的RollingFile中指定的name名称,子节点的level也是日志输出级别。

2)logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。每个logger可以指定一个level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF),不指定时level默认为ERROR。

level:日志输出级别,共有8个级别,按照从低到高为:All < Trace < Debug < Info < Warn < Error < Fatal < OFF

name:用来指定该 Logger所适用的类或者类所在的包全路径,继承自 Root节点.

AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自 Root如果指定了,那么会在指定的这个Appender和 Root的Appender中都会输出,此时我们可以设置 Logger的 additivity="false"只在自定义的 Appender中进行输出。

案例配置:

1.3 log4j的日志格式化api

1.3.1 api详解

  log4j - 输出格式控制, PatternLayout参数含义以及详细配置 - frank_cui - 博客园 

1.3.2 演示案例

1.查看 %l

2. 查看%L

2. 查看%L

3查看%msg

 1.3.3 演示案例

%L,%line:显示日志输出的代码所在的行数。Log4j在输出行号时会检查堆栈信息,是耗时的操作。

%c{precision},%logger{precision}:

logger名称,precision可以是一个正整数、负整数、"1."、"1.1.."、"."等格式,用于指定输出的logger的名称的层级和详细程度。

%C{precision},%class{precision}:输出调用者的权限定类名,precision的规则与logger名称的用法相同。Log4j在输出类名时会检查堆栈信息,是耗时的操作,建议使用%c{precision}或%logger{precision}代替。

%d{pattern},%date{pattern}:输出日志事件的时间,pattern经常包含若干对包含时间/日期格式(SimpleDateFormat)的花括号。

%m,%msg:输出应用中自定义的日志内容;

%M,%method:输出方法名。Log4j在输出行号时会检查堆栈信息,是耗时的操作;

%n:输出当前运行平台所用的换行符,一般放在末尾;

%p|level{level=label, level=label, ...},%p|level{length=n}%p|level{lowerCase=true|false}:

输出日志的级别。可以每个日志级别指定别名,如%level{WARN=W, DEBUG=D, ERROR=E, TRACE=T, INFO=I},%level{length=1}也可以实现同样的效果,如果length的值超过了日志级别的名称,那么使用正常的日志级别名称。

level=label和length=n可以组合使用,如%level{ERROR=Error, length=2}为ERROR级别指定了别名,为其他日志级别限定了长度。此外,还可以指定级别的大小写。

%T,%tid,%threadId:输出日志的线程号,非常有必要;

%t,%tn,%thread,%threadName:输出日志的线程名称,类似于线程号作用相同,可选择其中一个https://blog.csdn.net/qq_34253002/article/details/129821103

1.4 log4j中onmatch和onmismatch的区别*

1.4.1 案例

表示匹配级别info以上的则输出,info级别以下的不匹配则忽略。

1.4.2 onmatch的api

OnMatch和onMismatch都有3个属性值,分别为ACCEPT,deny和neutal

Onmatch

Onmismatch

Accept:匹配该级别以上

Accept:匹配该级别以下

Deny:不匹配该级别以上

Deny:不匹配该级别以下

Neutral:该级别以上的,由下一个filter处理,如果当前是最后一个,则表示匹配该级别以上。

该级别以及以下的,由下一个filter处理,如果当前是最后一个,则不匹配该级别以下的。

Log4j2的onMatch和onMismatch属性值详解-CSDN博客

在log4j2中,日志级别从低到高依次为: all,trace,debug,info,warn,error,fatal,off。

当设置onMismatch=neutal时,当前过滤器不会对日志事件做出接受或拒绝的决定,而是将事件传递给下一个过滤器处理,如果当前过滤器是最后一个那么不匹配当前日志级别以下的事件将被忽略。

例如,第一个过滤器level设置为error且onmatch为deny,onmismatch=accept,这意味着会输出error以下级别(warn,info,debug,trace)的日志,

当onmismatch=netral,则这些日志事件会继续传递给下一个过滤器处理,而不是被当前过滤器直接处理或者忽略掉。

1.5 logback,log4j2和slf4j的区别

1)SLF4J: 是一个日志门面(抽象层),不是具体实现;提供统一的日志接口,允许用户在部署时选择不同的日志实现;支持多个日志实现:logback、log4j、java.util.logging等

2)Log4j: Apache的开源日志实现;Log4j 1.x已经停止维护;Log4j 2.x是完全重写的版本

3)Logback; Log4j创始人开发的新一代日志框架;作为Log4j的继承者,是SLF4J的原生实现。深入解析Java日志框架:Logback、Log4j 2与SLF4J的区别与使用指南_slf4j logback-CSDN博客4)推荐使用方案:

1. SLF4J + Logback(首选)

2. SLF4J + Log4j2(备选)

5)为什么选用log4j2

相比与其他的日志系统,log4j2丢数据这种情况少;disruptor技术,在多线程环境下,性能高于logback等10倍以上;利用jdk1.5并发的特性,减少了死锁的发生;https://blog.csdn.net/weixin_44001965/article/details/143703014

对于Java工程师来说,关于日志工具的使用,最佳实践就是在应用中使用。如log4j2 + slf4j这样的组合来进行日志输出。这样做的最大好处,就是业务层的开发不需要关心底层日志框架的实现及细节,在编码的时候也不需要考虑日后更换框架所带来的成本。这也是日志接口(门面模式)所带来的好处。

Log4j2使用详解

1.6 log4j2的异常日志格式配置

https://blog.csdn.net/sz85850597/article/details/120572827

1.7 log4j2的异步日志配置

https://blog.51cto.com/1936625305/11823448

<loggers>

    <!--includeLocation 打印行号,如果这里不设置,就算%L 也不会打印行号-->

    <AsyncRoot level="DEBUG" includeLocation="true" >

        <AppenderRef ref="CONSOLE"/>

    </AsyncRoot>

    <AsyncLogger name="com.luna" level="INFO" includeLocation="true" >

        <appender-ref ref="FILE-INFO"/>

        <appender-ref ref="FILE-ERROR"/>

    </AsyncLogger>

    <AsyncLogger name="druid.sql.Statement" level="DEBUG" additivity="false" includeLocation="true" >

        <appender-ref ref="CONSOLE"/>

        <appender-ref ref="FILE-INFO"/>

    </AsyncLogger>

</loggers>

1.8 log4j2的日志滚动和过期策略配置

<!--http://logging.apache.org/log4j/2.x/manual/appenders.html#RollingRandomAccessFileAppender-->

    <!--

    name:FILE-INFO  appender 名字可以自定义,logger引用使用

    fileName:当前日志名称,如果是多级目录,则会自动创建

    filePattern:归档日志格式

    -->

    <RollingRandomAccessFile name="FILE-INFO"

                             fileName="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.log"

                             filePattern="${BASE_LOG_PATH}/${SERVER_NAME}/${SERVER_NAME}-info.%d{yyyy-MM-dd}-%i.log.gz">

        <!--

            minLevel:最小日志级别

            maxLevel:最大日志级别

            onMatch:匹配成功接收

            onMismatch:匹配失败丢弃

        -->

        <LevelRangeFilter minLevel="WARN" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>

        <!--

            pattern:日志格式

            charset:日志字符编码

        -->

        <PatternLayout pattern="${PATTERN}" charset="${CHARSET}" />

        <Policies>

            <!--每天滚动一次,interval的单位 取决于filePattern 我这里定义的是dd(天)也就是每天会产生一个新的日志文件 -->

            <TimeBasedTriggeringPolicy interval="1"/>

            <!--或者日志文件达到10KB 滚动一次-->

            <SizeBasedTriggeringPolicy size="10KB"/>

        </Policies>

        <!--日志删除策略-->

        <!--DefaultRolloverStrategy 默认的max=7 代表的是dd(天)最多产生7个文件,多余自动删除,但是我们会自己定义删除策略所以要屏蔽这个配置,如果不屏蔽这个配置,则当天日志最多只有7个 -->

        <!--源码:org.apache.logging.log4j.core.appender.rolling.DefaultRolloverStrategy.Builder.build ,当fileIndex=nomax,不在使用max变量 -->

        <DefaultRolloverStrategy fileIndex="nomax">

            <!--basePath:从此处扫描需要删除的日志基本路径,maxDepth:要访问的日志目录最大级别数,默认是1  -->

            <!--例如我们的日志是/data/logs/app/app-info.log,basePath=/data/logs,maxDepth=2 恰好能访问到app-info.log -->

            <Delete basePath="${BASE_LOG_PATH}/${SERVER_NAME}" maxDepth="2">

                <!--删除,正则匹配到文件名-->

                <IfFileName glob="*-info.*.log.gz"/>

                <!--删除,日志距离现在多长事件,P1D代表是1天-->

           <!--http://logging.apache.org/log4j/2.x/log4j-core/apidocs/org/apache/logging/log4j/core/appender/rolling/action/Duration.html-->

                <IfLastModified age="P1D"/>

            </Delete>

        </DefaultRolloverStrategy>

    </RollingRandomAccessFile>

详细配置:https://blog.51cto.com/1936625305/11823448

1.9 log4j2设置颜色

1.9.1 设置颜色

SpringBoot整合Log4j2日志框架 - Evan1024 - 博客园  整个log4j2框架

    <Console name="consoleAppender" target="SYSTEM_OUT">

            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->

            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>

            <!--设置日志格式及颜色-->

            <PatternLayout

                    pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"

                     noConsoleNoAnsi="false"/>

        </Console>

<Console name="consoleAppender" target="SYSTEM_OUT">
<!--设置日志格式及颜色-->
<PatternLayout 

pattern="%style{%d{ISO8601}}{bright,green} %highlight{%-5level} [%style{%t}{bright,blue}] %style{%C{}}{bright,yellow}: %msg%n%style{%throwable}{red}"   disableAnsi="false" noConsoleNoAnsi="false"/>
</Console>

1.9.2 设置颜色方式

修改日志配置中pattern属性, 通过%style{xxxx}{styleValue1,styleValue2}和%highlight{}可以很容易修改日志样式。设置属性disableAnsi为false,表示开启Ansi,这样才会输出有样式的日志。

https://mp.weixin.qq.com/s/jN9h2FjSQKPXv8mkShkJ_g

方式1:style{pattern}{ANSI style}

%style{%d{ISO8601}}{black} %style{[%t]}{blue} %style{%-5level:}{yellow} %style{%msg%n%throwable}{green}

方式2:highlight{pattern}{style}

%highlight{%d [%t] %-5level: %msg%n%throwable}

%highlight{%d [%t] %-5level: %msg%n%throwable}{STYLE=Logback}

1.9.3 设置颜色案例

%style{%throwable}{red} 异常信息标红色

<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %style{%L}{red} %M - %msg%style{%throwable}{red}%n"  disableAnsi="false" noConsoleNoAnsi="false"/>

案例截图如下:https://mp.weixin.qq.com/s/yYzFN7OTMh9IO8x_LaGLWg

1.10 log4j2的配置使用

https://cloud.tencent.com/developer/article/2332025

使用了Lombok提供的@Log4j2注解,自动生成了一个名为log的Logger对象。在类中的方法中通过log对象记录了相应的日志信息。

1.11 log4j2中includeLocation=true

在includeLocation=true的作用确保日志输出中包含类的路径和行号信息,对于调式和定位问题非常有帮助。如下图

<AsyncLogger name=”st” level=”debug” includeLocation=”true”>

</AsyncLogger>

当设置为false时,不再输出行号信息。

1.12 log4j2中日志格式化和日志分片

1.日志格式化

2.日志分片:https://mp.weixin.qq.com/s/-a3tvoOo_3ppX68fP92FOA

1.13 log4j2中排除包和依赖包

1.排除包

log4j与log4j2性能对比及log4j升级至log4j2方案

<exclusions>

    <!-- log4j 相关包 -->

    <exclusion>

        <artifactId>log4j</artifactId>

        <groupId>log4j</groupId>

    </exclusion>

    <exclusion>

        <groupId>org.slf4j</groupId>

        <artifactId>log4j</artifactId>

    </exclusion>

    <exclusion>

        <groupId>org.slf4j</groupId>

        <artifactId>slf4j-log4j12</artifactId>

    </exclusion>

    <!-- log4j 的springboot starter -->

    <exclusion>

        <artifactId>spring-boot-starter-log4j</artifactId>

        <groupId>org.springframework.boot</groupId>

    </exclusion>

    <!-- logback 相关包 -->

    <exclusion>

        <artifactId>logback-classic</artifactId>

        <groupId>ch.qos.logback</groupId>

    </exclusion>

    <exclusion>

        <artifactId>logback-core</artifactId>

        <groupId>ch.qos.logback</groupId>

    </exclusion>

    <!-- slf4j 相关包 -->

    <exclusion>

        <artifactId>slf4j-log4j12</artifactId>

        <groupId>org.slf4j</groupId>

    </exclusion>

     <exclusion>

        <artifactId>log4j-to-slf4j</artifactId>

        <groupId>org.apache.logging.log4j</groupId>

    </exclusion>

    <exclusion>

        <artifactId>slf4j-api</artifactId>

        <groupId>org.slf4j</groupId>

    </exclusion>

2.新增包

<!-- log4j2的api、core和web包 -->

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-api</artifactId>

    <version>2.11.1</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-core</artifactId>

    <version>2.11.1</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-web</artifactId>

    <version>2.11.1</version>

</dependency>

<!-- slf4j与log4j2的连接包 -->

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-slf4j-impl</artifactId>

    <version>2.11.1</version>

</dependency>

<!-- log4j与log4j2的连接包 -->

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-1.2-api</artifactId>

    <version>2.11.1</version>

</dependency>

<!-- log4j2支撑完全异步模式的关键api -->

<dependency>

    <groupId>com.lmax</groupId>

    <artifactId>disruptor</artifactId>

    <version>3.4.2</version>

</dependency>

<!-- slf4j本身的api -->

<dependency>

    <groupId>org.slf4j</groupId>

    <artifactId>slf4j-api</artifactId>

</dependency>

3.框架对应的包名

在log4j版本,Logger的包路径是org.apache.log4j。

在log4j2版本,Logger的包路径是org.apache.logging.log4j

4替换日志配置文件。

在log4j版本,配置文件为log4j.xml或者log4j.properties。

在log4j2版本,配置文件为log4j2.xml。

相关文章:

springboot整合log4j2日志框架1

目录 一 log4j基本知识 1.1 log4j的日志级别 1.2 log4j的日志文件结构* 1.2.1 概述 1.2.2 详解 1.3 log4j的日志格式化api 1.3.1 api详解 1.3.2 演示案例 1.3.3 演示案例 1.4 log4j中onmatch和onmismatch的区别* 1.4.1 案例 1.4.2 onmatch的api 1.5 logback&#x…...

06 - Django 视图view

HttpRequest 和 HttpResponse Django中的视图主要用来接受Web请求&#xff0c;并做出响应。 视图的本质就是一个Python中的函数 视图的响应分为两大类 以Json数据形式返回(JsonResponse)以网页的形式返回 重定向到另一个网页 (HttpResponseRedirect)错误视图(4XX,5XX) (Htt…...

基于云计算的资源管理系统

基于云计算的资源管理系统是一种将云计算技术与资源管理技术相结合&#xff0c;以实现资源高效利用和管理的系统。以下是对该系统的详细分析&#xff1a; 一、系统概述 云计算是一种基于网络的计算模式&#xff0c;通过将计算资源和数据存储在云端服务器上&#xff0c;使用户…...

从0入门自主空中机器人-3-【环境与常用软件安装】

关于本课程&#xff1a; 本次课程是一套面向对自主空中机器人感兴趣的学生、爱好者、相关从业人员的免费课程&#xff0c;包含了从硬件组装、机载电脑环境设置、代码部署、实机实验等全套详细流程&#xff0c;带你从0开始&#xff0c;组装属于自己的自主无人机&#xff0c;并让…...

electron node-api addon开发

解决方案入口 拷贝日志以及json等第三方源码 增加包含目录 编写接口 默认模板已经有一个回调函数了 照葫芦画瓢就行 其中几个重要的点要注意 1.参数传入 比如如下的例子&#xff1a; 头文件定义&#xff1a; public:下增加 Napi::Value StartAnswer (const Napi::Callb…...

如何在嵌入式系统或计算机系统中验证boot程序

在嵌入式系统或计算机系统中&#xff0c;验证boot程序&#xff08;引导程序&#xff09;的正确性至关重要&#xff0c;因为它负责初始化系统硬件、加载操作系统内核&#xff0c;并设置系统环境。以下是一些常用的验证boot程序的方法&#xff1a; 一、硬件验证 示波器与逻辑分…...

scala基础学习_运算符

文章目录 scala运算符算术运算符关系运算符逻辑运算符位运算符其他运算符赋值运算符 scala运算符 在 Scala 中&#xff0c;运算符通常被定义为方法。这意味着你可以将运算符视为对象上的方法调用。以下是一些常用的运算符及其对应的操作&#xff1a; 算术运算符 &#xff1a…...

【ANGULAR网站开发】初始环境搭建

1. 初始化angular项目 1.1 创建angular项目 需要安装npm和nodejs&#xff0c;这边不在重新安装 直接安装最新版本的angular npm install -g angular/cli安装指定大版本的angular npm install -g angular/cli181.2 启动angular 使用idea启动 控制台启动 ng serve启动成功…...

【Java】面试题 并发安全 (2)

文章目录 可重入锁&#xff08;ReentrantLock&#xff09;知识总结1. 可重入锁概念与特点2. 基本语法与使用注意事项3. 底层实现原理4. 面试回答要点 synchronized与lock的区别死锁相关面试题讲解死锁产生的四个条件ConcurrentHashMap2. JDK1.7的ConcurrentHashMap结构添加数据…...

springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失

这个包丢失了 启动不了 起因是pom中加入了 <tomcat.version></tomcat.version>版本指定&#xff0c;然后idea自动编译后&#xff0c;包丢了&#xff0c;删除这个配置后再也找不回来&#xff0c; 这个包正常在 <dependency><groupId>org.springframe…...

React 组件的通信方式

在 React 应用开发中&#xff0c;组件之间的通信是构建复杂用户界面和交互逻辑的关键。正确地实现组件通信能够让我们的应用更加灵活和易于维护。以下是几种常见的 React组件通信方式。 一、父子组件通信 1. 通过 props 传递数据&#xff08;父组件向子组件传递数据&#xff0…...

WAV文件双轨PCM格式详细说明及C语言解析示例

WAV文件双轨PCM格式详细说明及C语言解析示例 一、WAV文件双轨PCM格式详细说明1. WAV文件基本结构2. PCM编码方式3. 双轨PCM格式详细说明二、C语言解析WAV文件的代码示例代码说明一、WAV文件双轨PCM格式详细说明 WAV文件是一种用于存储未压缩音频数据的文件格式,广泛应用于音频…...

【ES6复习笔记】数值扩展(16)

介绍 在 JavaScript 中&#xff0c;数值扩展提供了一些额外的功能&#xff0c;使得处理数值变得更加方便。本教程将介绍一些常用的数值扩展方法和属性。 1. Number.EPSILON Number.EPSILON 是 JavaScript 表示的最小精度。它的值接近于 2.2204460492503130808472633361816E-…...

百度热力图数据日期如何选择

目录 1、看日历2、看天气 根据研究内容定&#xff0c;一般如果研究城市活力的话&#xff0c;通常会写“非重大节假日&#xff0c;非重大活动&#xff0c;非极端天气等”。南方晴天不多&#xff0c;有小雨或者中雨都可认为没有影响&#xff0c;要不然在南方很难找到完全一周没有…...

Vue.js 高级组件开发:设计模式与实践

Vue.js 高级组件开发&#xff1a;设计模式与实践 引言一、组合式 API 与动态依赖注入1. 基于 provide/inject 的动态依赖2. 动态依赖注入与懒加载 二、动态渲染与自定义渲染函数1. 使用 Render 函数动态生成内容2. 自定义 vnode 操作 三、复杂场景下的动态表单生成与验证四、高…...

《一文读懂卷积网络CNN:原理、模型与应用全解析》

《一文读懂卷积网络CNN&#xff1a;原理、模型与应用全解析》 一、CNN 基本原理大揭秘&#xff08;一&#xff09;从人类视觉到 CNN 灵感&#xff08;二&#xff09;核心组件详解 二、经典 CNN 模型巡礼&#xff08;一&#xff09;LeNet-5&#xff1a;开山鼻祖&#xff08;二&a…...

MONI后台管理系统-数据敏感字段存储加密

前言&#xff1a;     在我们数据库中&#xff0c;存在很多的敏感数据&#xff0c;如用户表中&#xff0c;存在用户电话、身份证号、邮箱等属于用户的敏感信息&#xff0c;我们通常在存入数据库后&#xff0c;将其进行加密存储&#xff0c;以此来保证数据安全性。     …...

熟悉各类游戏设计模式的用途与限制,如 factory、strategy、mvc、object pool 等

良好的系统分析与设计能力要求开发者熟悉并正确运用各种设计模式来解决特定问题。设计模式是一种针对特定问题的通用解决方案&#xff0c;可提高代码的可复用性、可维护性和可扩展性。以下是对一些常见游戏设计模式的详细分析&#xff0c;包括其用途、限制和代码示例。 一、工厂…...

【RabbitMQ高级篇】消息可靠性问题(1)

目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…...

ASP.NET |日常开发中常见问题归纳讲解

ASP.NET &#xff5c;日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态&#xff08;在ASP.NET Web Forms 中&#xff09; 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击&#xff08;XSS&#xff09; 三、状态管理问题3.1 会话状态&#xff08;Session …...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中&#xff0c;iftop是网络管理的得力助手&#xff0c;能实时监控网络流量、连接情况等&#xff0c;帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...