Spring Boot Logback 日志配置詳解:從基礎到分布式追蹤

日志是應用程序不可或缺的組成部分,它不僅能幫助我們調試問題,還能監控系統運行狀態。在 Spring Boot 生態中,Logback 憑借其高性能和靈活性成為首選的日志框架。本文將通過一個實際的 Logback 配置文件,詳細解析其各個組件的功能和配置技巧。

什么是 Logback?

Logback 是由 Log4j 創始人設計的開源日志組件,是 Log4j 的繼任者。它分為三個模塊:

  • logback-core:核心組件,提供基礎功能
  • logback-classic:實現了 SLF4J API,可直接替換 Log4j
  • logback-access:與 Servlet 容器集成,提供 HTTP 訪問日志功能

在 Spring Boot 中,Logback 是默認的日志框架,無需額外依賴即可使用。

完整配置文件解析

<?xml version="1.0" encoding="UTF-8"?>
<!--Copyright 2010-2011 The myBatis TeamLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
-->
<configuration debug="false"><!--定義日志文件的存儲地址 勿在 LogBack 的配置中使用相對路徑--><springProperty scope="context" name="LOG_HOME" source="HuiChen.log.directory"/><springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="huichen-device-sms-manager"/><springProperty scope="context" name="LOG_LEVEL" source="HuiChen.log.level" defaultValue="debug"/><!-- 彩色日志 --><!-- 彩色日志依賴的渲染類 --><conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/><conversionRule conversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/><conversionRule conversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><!-- 彩色日志格式 --><property name="CONSOLE_LOG_PATTERN"value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/><!-- Console 輸出設置 --><appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!--        <encoder>-->
<!--            <pattern> ${CONSOLE_LOG_PATTERN}</pattern>-->
<!--            <charset>utf8</charset>-->
<!--        </encoder>--><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><pattern>[%tid] ${CONSOLE_LOG_PATTERN}</pattern></layout><charset>utf-8</charset></encoder></appender><!-- 按照每天生成INFO日志文件 --><appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件輸出的文件名--><FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.info.%i.log</FileNamePattern><!--日志文件保留天數--><MaxHistory>30</MaxHistory><!--日志文件最大的大小--><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder></appender><!-- 按照每天生成ERROR日志文件 --><appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!--日志文件輸出的文件名--><FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.error.%i.log</FileNamePattern><!--日志文件保留天數--><MaxHistory>30</MaxHistory><!--日志文件最大的大小--><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符--><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><!-- 此日志文件只記錄info級別的 --><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter></appender><!-- skywalking 采集日志 --><appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder></appender><!--myibatis mongodb log configure--><logger name="com.apache.ibatis" level="TRACE"/><logger name="java.sql.Connection" level="DEBUG"/><logger name="java.sql.Statement" level="DEBUG"/><logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!--    <logger name="org.springframework.data.mongodb.core" level="DEBUG"/><logger name="org.springframework.data.redis.core" level="DEBUG"/><logger name="org.springframework.data.elasticsearch" level="DEBUG"/><logger name="org.springframework.data.neo4j" level="DEBUG"/>--><logger name="com.sms.manager" level="DEBUG"/><!-- 日志輸出級別 INFO--><root level="${LOG_LEVEL}"><appender-ref ref="STDOUT"/><appender-ref ref="grpc-log"/><appender-ref ref="FILEINFO"/><appender-ref ref="FILEERROR"/></root><!--日志異步到數據庫 --><!--<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">--><!--&lt;!&ndash;日志異步到數據庫 &ndash;&gt;--><!--<connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">--><!--&lt;!&ndash;連接池 &ndash;&gt;--><!--<dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">--><!--<driverClass>com.mysql.jdbc.Driver</driverClass>--><!--<url>jdbc:mysql://baas.ievent.cn:3306/ievent</url>--><!--<user>live</user>--><!--<password>novacloudlive</password>--><!--</dataSource>--><!--</connectionSource>--><!--</appender>-->
</configuration>

下面我們將逐部分解析一個生產級別的 Logback 配置文件,理解其各個組件的作用。

1. 配置文件基本結構

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false"><!-- 配置內容 -->
</configuration>
  • debug="false":關閉 Logback 自身的調試日志,生產環境建議關閉

2. 動態屬性定義

<springProperty scope="context" name="LOG_HOME" source="HuiChen.log.directory"/>
<springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="huichen-device-sms-manager"/>
<springProperty scope="context" name="LOG_LEVEL" source="HuiChen.log.level" defaultValue="debug"/>

這部分配置通過?<springProperty>?標簽將 Spring 環境中的配置注入到 Logback 中,實現了配置的動態化和外部化:

  • LOG_HOME:日志文件存儲目錄,值來自 Spring 配置的?HuiChen.log.directory
  • APP_NAME:應用名稱,默認值為?huichen-device-sms-manager,可通過?spring.application.name?覆蓋
  • LOG_LEVEL:全局日志級別,默認?debug,可通過?HuiChen.log.level?配置

這種方式的優勢在于:

  • 可以在不同環境(開發、測試、生產)使用不同的配置
  • 無需修改 Logback 配置文件即可調整日志行為
  • 符合 Spring Boot 外部化配置的理念

3. 彩色日志配置

<!-- 彩色日志依賴的渲染類 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/><!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

這段配置實現了控制臺彩色日志輸出:

  • <conversionRule>:定義了三個轉換規則,用于日志的彩色渲染和異常信息格式化
  • CONSOLE_LOG_PATTERN:定義了控制臺日志的輸出格式,其中:
    • %clr(...):用于指定日志元素的顏色
    • %d{...}:日期時間,格式為 yyyy-MM-dd HH:mm:ss.SSS
    • %5p:日志級別,占 5 個字符寬度
    • ${PID:- }:進程 ID
    • %15.15t:線程名,最長 15 個字符
    • %-40.40logger{39}:日志器名稱,最長 40 個字符
    • %m%n:日志消息和換行符

彩色日志的優勢在于:

  • 不同級別日志用不同顏色顯示,便于快速識別
  • 關鍵信息(如線程名、類名)有顏色區分,提高可讀性
  • 異常堆棧信息格式化顯示,便于調試

4. 日志輸出目的地(Appender)

Appender 定義了日志的輸出方式和位置,一個配置文件中可以有多個 Appender。

4.1 控制臺輸出(STDOUT)
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout"><pattern>[%tid] ${CONSOLE_LOG_PATTERN}</pattern></layout><charset>utf-8</charset></encoder>
</appender>

這是一個輸出到控制臺的 Appender:

  • name="STDOUT":Appender 的名稱,用于后續引用
  • class="ch.qos.logback.core.ConsoleAppender":指定這是控制臺輸出的 Appender
  • <encoder>:編碼器,負責將日志事件轉換為字符串
    • LayoutWrappingEncoder:使用自定義布局的編碼器
    • TraceIdPatternLogbackLayout:集成了 SkyWalking 的布局,用于添加分布式追蹤 ID
    • [%tid]:SkyWalking 追蹤 ID,在分布式系統中非常有用
    • charset="utf-8":日志編碼格式
4.2 INFO 級別日志文件(FILEINFO)
<appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 日志文件輸出的文件名 --><FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.info.%i.log</FileNamePattern><!-- 日志文件保留天數 --><MaxHistory>30</MaxHistory><!-- 日志文件最大的大小 --><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder>
</appender>

這是一個滾動輸出 INFO 級別日志到文件的 Appender:

  • class="ch.qos.logback.core.rolling.RollingFileAppender":滾動文件輸出 Appender,支持日志文件分割
  • <rollingPolicy>:滾動策略,這里使用?SizeAndTimeBasedRollingPolicy,結合了時間和大小的滾動策略
    • FileNamePattern:日志文件命名規則,包含日期和序號
    • MaxHistory:日志文件保留 30 天
    • MaxFileSize:單個日志文件最大 10MB,超過則創建新文件
  • <encoder>:定義了文件日志的格式,包含日期、線程、級別、日志器和消息
4.3 ERROR 級別日志文件(FILEERROR)
<appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"><rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><FileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.error.%i.log</FileNamePattern><MaxHistory>30</MaxHistory><MaxFileSize>10MB</MaxFileSize></rollingPolicy><encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern></encoder><filter class="ch.qos.logback.classic.filter.LevelFilter"><level>error</level><onMatch>ACCEPT</onMatch><onMismatch>DENY</onMismatch></filter>
</appender>

這個 Appender 專門用于記錄 ERROR 級別日志:

  • 與 FILEINFO 類似,但增加了?<filter>?配置
  • LevelFilter:級別過濾器,只接受 ERROR 級別的日志
    • onMatch>ACCEPT</onMatch>:匹配 ERROR 級別則接受
    • onMismatch>DENY</onMismatch>:不匹配則拒絕

將 ERROR 日志單獨存儲的好處:

  • 便于快速定位錯誤,無需在大量日志中篩選
  • 可以設置更長的保留時間,便于問題追溯
  • 不同級別的日志可以有不同的處理策略
4.4 SkyWalking 日志采集(grpc-log)
<appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender"><encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"><layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.mdc.TraceIdMDCPatternLogbackLayout"><Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern></layout></encoder>
</appender>

這個 Appender 用于將日志發送到 SkyWalking APM 系統:

  • GRPCLogClientAppender:通過 gRPC 協議將日志發送到 SkyWalking 服務器
  • TraceIdMDCPatternLogbackLayout:將追蹤 ID 放入日志,實現分布式追蹤
  • [%X{tid}]:從 MDC(Mapped Diagnostic Context)中獲取追蹤 ID

集成 SkyWalking 的優勢:

  • 實現日志與分布式追蹤的關聯,便于微服務架構下的問題排查
  • 可以在 SkyWalking 控制臺查看全鏈路日志
  • 追蹤 ID 貫穿整個調用鏈,方便定位跨服務問題

5. 日志級別控制

<!-- myibatis mongodb log configure -->
<logger name="com.apache.ibatis" level="TRACE"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<!-- 
<logger name="org.springframework.data.mongodb.core" level="DEBUG"/>
<logger name="org.springframework.data.redis.core" level="DEBUG"/>
<logger name="org.springframework.data.elasticsearch" level="DEBUG"/>
<logger name="org.springframework.data.neo4j" level="DEBUG"/>
--><logger name="com.sms.manager" level="DEBUG"/><!-- 日志輸出級別 -->
<root level="${LOG_LEVEL}"><appender-ref ref="STDOUT"/><appender-ref ref="grpc-log"/><appender-ref ref="FILEINFO"/><appender-ref ref="FILEERROR"/>
</root>

這部分配置控制不同包或類的日志級別:

  • <logger>:針對特定包或類設置日志級別

    • name:指定包或類的全限定名
    • level:日志級別,從低到高為 TRACE < DEBUG < INFO < WARN < ERROR
    • 例如?com.sms.manager?包下的日志被設置為 DEBUG 級別
  • <root>:根日志配置,所有未被特定 logger 配置的類都繼承此配置

    • level="${LOG_LEVEL}":使用之前定義的動態屬性作為全局日志級別
    • <appender-ref>:引用前面定義的 Appender,表示日志會輸出到這些目的地

日志級別的作用:

  • 控制日志輸出的詳細程度,生產環境通常使用 INFO 級別減少日志量
  • 特定包可以設置更詳細的日志級別,便于調試
  • 避免不必要的日志輸出,提高系統性能

6. 數據庫日志(注釋部分)

配置文件中還有一個注釋掉的數據庫日志 Appender:

<!--
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender"><connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"><dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"><driverClass>com.mysql.jdbc.Driver</driverClass><url>jdbc:mysql://baas.ievent.cn:3306/ievent</url><user>live</user><password>novacloudlive</password></dataSource></connectionSource>
</appender>
-->

這個 Appender 用于將日志存儲到數據庫中,適用于需要對日志進行復雜查詢和分析的場景。但由于性能影響和配置復雜性,通常在生產環境中不推薦使用,除非有特殊需求。

實際應用中的最佳實踐

  1. 環境隔離

    • 開發環境:使用 DEBUG 級別,輸出到控制臺
    • 生產環境:使用 INFO 級別,輸出到文件,限制日志大小和保留時間
  2. 性能考慮

    • 避免在循環中輸出大量日志
    • 生產環境避免使用 DEBUG 級別
    • 適當設置日志文件大小和保留時間,避免磁盤空間耗盡
  3. 安全考慮

    • 日志中避免包含敏感信息(密碼、令牌等)
    • 確保日志文件有適當的權限控制
    • 敏感操作的日志應特別關注
  4. 分布式系統

    • 集成分布式追蹤系統(如 SkyWalking)
    • 確保日志中包含追蹤 ID,便于跨服務追蹤
    • 統一日志收集和分析(如使用 ELK 棧)

總結

本文詳細解析了一個生產級別的 Logback 配置文件,涵蓋了動態屬性、彩色日志、多目的地輸出、日志級別控制和分布式追蹤集成等方面。合理配置 Logback 不僅能幫助我們更好地理解系統運行狀態,還能在出現問題時快速定位和解決。

Logback 的配置靈活多變,應根據實際需求進行調整。在開發和生產環境中使用不同的配置,既能保證開發效率,又能確保生產系統的穩定運行。

希望本文能幫助你更好地理解和使用 Logback,構建更健壯的日志系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98103.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件體系結構——后端三層架構

三層架構——Controller、Service、Dao 不僅是對代碼進行的邏輯分層。其真正的本質&#xff0c;是將業務、技術和數據剝離。搞業務的專心做業務&#xff0c;搞技術的專心搞技術&#xff0c;做數據存儲的專心做數據存儲。三方通過接口進行對接&#xff0c;任一部分重構&#xff…

QML學習筆記(一)基本了解和工程配置

前言&#xff1a; 已經從事QT開發幾年了&#xff0c;但對于QML這個東西始終是沒有徹底掌握&#xff0c;一方面實際工作中沒有用到過&#xff0c;其次它的語法對我來說是全新的東西&#xff0c;不像QWidget那一套可以直接在C中去寫。這就是為什么網上都說qml更簡單&#xff0c;我…

SAP HANA Scale-out 04:緩存

結果緩存靜態結果緩存 Vs 動態結果緩存FeatureStatic Result CacheDynamic Result CacheTarget Scenario對復雜視圖&#xff08;通常是頂層視圖&#xff09;的查詢頻繁更新的大表&#xff08;例如ACDOCA&#xff09;上的聚合查詢Query result非實時數據實時數據ScopeTarget obj…

嘉興禾潤 HTR7216 (S) LED 驅動芯片:特性與應用

在如今智能設備飛速普及的時代&#xff0c;無論是智能家居的氛圍營造、IoT 設備的狀態提示&#xff0c;還是個人消費電子的視覺呈現&#xff0c;都離不開高性能 LED 驅動芯片的支撐。嘉興禾潤推出的 HTR7216 (S) LED 驅動芯片&#xff0c;憑借豐富的功能、精準的控制以及出色的…

Python實現劍龍優化算法 (Stegosaurus Optimization Algorithm, SOA)優化函數(付完整代碼)

Python實現劍龍優化算法 (Stegosaurus Optimization Algorithm, SOA)優化函數&#xff08;付完整代碼&#xff09;1.劍龍優化算法介紹劍龍優化算法&#xff08;Stegosaurus Optimization Algorithm&#xff0c;SOA&#xff09;是一種受劍龍獨特生理結構和行為模式啟發而設計的元…

分布式拜占庭容錯算法——權益證明(PoS)算法詳解

Java 實現權益證明&#xff08;PoS&#xff09;算法詳解 一、PoS 核心機制 #mermaid-svg-Sbj0HU6MjOl1yo5L {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Sbj0HU6MjOl1yo5L .error-icon{fill:#552222;}#mermaid-s…

【論文閱讀】谷歌:生成式數據優化,只需請求更好的數據

谷歌DeepMind團隊通過Generative Data Refinement&#xff08;GDR&#xff09;技術&#xff0c;成功將極端有毒的4chan討論數據轉化為安全且語義豐富的訓練素材&#xff0c;推動了LLM訓練數據凈化的新范式&#xff1a; ? GDR利用預訓練大模型對原始數據進行“重寫”&#xff0…

C++ 多線程實戰 10|C++20 的信號量、閂鎖與屏障

目錄 前言 學習目標 1. 信號量&#xff08;Semaphore&#xff09; 示例&#xff1a;限制并發下載任務 2. 閂鎖&#xff08;Latch&#xff09; 示例&#xff1a;賽跑 3. 屏障&#xff08;Barrier&#xff09; 示例&#xff1a;圖像處理流水線 4. 常見坑與對策 5. 實踐作…

【Java SE】01. 初識Java

1. 認識Java Java是一種優秀的程序設計語言&#xff0c;它具有令人賞心悅目的語法和易于理解的語義。Java還是一個有一系列計算機軟件和規范形成的技術體系&#xff0c;這個技術體系提供了完整的用于軟件開發和跨平臺部署的支持環境&#xff0c;并廣泛應用于嵌入式系統、移動終…

解鎖倉儲智能調度、運輸路徑優化、數據實時追蹤,全功能降本提效的智慧物流開源了

AI 視頻監控平臺&#xff1a;全鏈路協同驅動的智能監控解決方案AI 視頻監控平臺是一款融合高性能功能與輕量化操作的實時算法驅動型視頻監控系統&#xff0c;其核心愿景在于深度破除不同芯片廠商間的技術壁壘&#xff0c;省去冗余重復的適配環節&#xff0c;最終達成芯片、算法…

冒泡排序與選擇排序以及單鏈表與雙鏈表

1. 冒泡排序&#xff08;Bubble Sort&#xff09; 1. 原理 冒泡排序是一種 簡單的排序算法&#xff0c;通過 兩兩比較相鄰元素&#xff0c;把較大的元素逐漸 “冒泡” 到數組末尾。 思路&#xff1a; 從數組頭開始&#xff0c;比較相鄰兩個元素。 如果前一個比后一個大&…

Python實現計算點云投影面積

本次我們分享一種基于 Open3D 的快速、穩健方法&#xff0c;用于從激光點云中自動提取“地面”并計算其投影面積。算法先自適應估計地面高程&#xff0c;再將地面點投影至水平面&#xff0c;隨后用凸包或最小外接矩形求取面積。整個流程無需人工干預&#xff0c;單文件即可運行…

AXI4 協議

一、AXI4簡介AXI4&#xff08;Advanced eXtensible Interface 4&#xff09;是ARM公司推出的高性能片上總線協議&#xff0c;屬于AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;標準的一部分。它專為高帶寬、低延遲的片上通信設計&#xff0c;廣泛應用…

《餓殍:明末千里行》Switch版試玩發布 3月13日發售

使用jQuery的常用方法與返回值分析 jQuery是一個輕量級的JavaScript庫&#xff0c;旨在簡化HTML文檔遍歷和操作、事件處理以及動畫效果的創建。本文將介紹一些常用的jQuery方法及其返回值&#xff0c;幫助開發者更好地理解和運用這一強大的庫。 1. 選擇器方法 jQuery提供了多種…

[特殊字符] 認識用戶手冊用戶手冊(也稱用戶指南、產品手冊)是通過對產品功能的清

一份優秀的用戶手冊能有效降低用戶的使用門檻&#xff0c;提升用戶體驗和工作效率。下面我將為你梳理編寫用戶手冊的核心要點、步驟和技巧。&#x1f4d6; 認識用戶手冊用戶手冊&#xff08;也稱用戶指南、產品手冊&#xff09;是??通過對產品功能的清晰解釋&#xff0c;為特…

蘋果軟件代碼混淆,iOS混淆、iOS加固、ipa安全與合規取證注意事項(實戰指南)

在移動軟件交付與合規審計中&#xff0c;蘋果軟件代碼混淆已成為保護知識產權與用戶數據的常規手段。但混淆帶來的不僅是逆向難度的提升&#xff0c;也會觸發崩潰取證、符號化&#xff08;symbolication&#xff09;、審計合規與法律證據保存等問題。本文從工程與合規雙視角出發…

Redis框架詳解

目錄 1. redis是什么 主要特點 2. redis中存儲的數據類型 2.1 String類型 2.2 List類型 2.3 Hash類型 2.4 Set類型 2.5 Zset類型 2.6 其它類型 3.redis高可用框架 1. redis是什么 Redis 是一個開源的、基于內存的數據結構存儲系統&#xff0c;是 Remote Dictionary…

每日隨機展示10個wordpress置頂文章

WordPress 置頂文章是博主根據自己的需要設置的&#xff0c;通常用于展示重要或熱門的文章。 以下是一個示例代碼&#xff0c;用于在 WordPress 主題中展示 10 個置頂文章&#xff1a; <?php // 查詢置頂文章 $sticky get_option(sticky_posts); $args array(post__in …

金融工程vs金融數學:誰更貼近量化交易?

在金融行業邁向高度數字化的今天&#xff0c;量化交易已成為頂尖金融機構的核心競爭力之一。它以數學模型為基礎&#xff0c;借助編程技術實現策略自動化&#xff0c;在高頻、中低頻、套利、因子投資等多個領域展現出強大生命力。對于有志于此的大學生而言&#xff0c;選擇一個…