java_spring boot 中使用 log4j2 及 自定義layout設置示例

1. ?log4j2對比 原始Logback 優勢

對于 Spring Boot 3.x,Logback 是默認日志框架,但在高并發、異步日志場景下,Log4j2 通常表現更優。當業務百萬級用戶、微服務、日志量大時:


? 1. Logback(默認 Spring Boot 集成)

優勢:

  • Spring Boot 原生支持:無需額外配置即可使用。

  • 生態成熟:有 logstash-logback-encoder,方便輸出 JSON 日志。

  • 簡單易用:配置相對直觀,官方支持全面。

  • 性能穩定:同步寫日志表現很好。

劣勢:

  • 異步性能略弱于 Log4j2:需要借助 AsyncAppender,但整體吞吐比 Log4j2 略低。

  • 無內建 LMAX Disruptor:在極端高并發下性能不如 Log4j2。


? 2. Log4j2

優勢:

  • 異步日志性能極強:基于 LMAX Disruptor,比 Logback AsyncAppender 快 10 倍以上。

  • 支持異步安全:IO 密集型日志收集(比如發送到 Kafka)更高效。

  • 靈活的 JSON Layout:自帶 JsonTemplateLayout,不依賴第三方包。

  • 熱加載配置文件:支持修改日志級別而不重啟服務。

劣勢:

  • 非默認框架:需要額外依賴,Spring Boot starter 需要 spring-boot-starter-log4j2 替換。

  • 生態稍弱于 Logback:但主流場景完全足夠。

2. 使用版本信息

  • spring boot 3.3.2
  • log4j2: 跟隨 spring boot版本,不必特意指定 (spring boot 3.3.2 默認對應log4j2 版本 是?2.24.0
  • jackson: 2.17.2 (參考官網 https://github.com/apache/logging-log4j2/blob/rel/2.24.0/src/changelog/2.24.0/update_com_fasterxml_jackson_jackson_bom.xml)
  • win11下

父pom配置

    <!-- https://github.com/spring-projects/spring-boot/releases?page=4 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.3.2</version> <!--對應 mybatis-plus.version 3.5.8--><relativePath/></parent><properties><log4j2.version>2.24.0</log4j2.version> <!--spring boot 3.3.2 默認對應log4j2--><!--https://github.com/apache/logging-log4j2/blob/rel/2.24.0/src/changelog/2.24.0/update_com_fasterxml_jackson_jackson_bom.xml--><jackson.version>2.17.2</jackson.version><dependencyManagement><dependencies><!-- 核心 Spring Boot Starter,但排除默認日志框架 Logback --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- 強制所有 commons-logging 排除 --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version> <!-- 任意真實存在的版本 --><!--標記 scope 為 provided,這樣 Maven 會認為依賴存在,但不會打包--><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>${jackson.version}</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>${jackson.version}</version></dependency></dependencies></dependencyManagement>

子使用模塊 service-user 配置

pom配置:
?

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><!-- 可選:Log4j2 JSON Layout --><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-layout-template-json</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId></dependency>

resources 中的 log4j2-spring.xml 配置

log4j2-spring.xml 必須放到 resources 目錄下, 不能再加一層目錄。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="TRACE" monitorInterval="30" messageFactory="org.apache.logging.log4j.message.ParameterizedMessageFactory"><Properties><Property name="LOG_PATH">C:/Data/logs</Property><Property name="LOG_FILE_NAME">log_${spring:spring.application.name:-unknown}</Property><Property name="service.name">${spring:spring.application.name:-unknown}</Property></Properties><Appenders><!-- 控制臺輸出(原始格式) --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="jjj %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><!-- JSON 文件輸出 --><RollingFile name="JsonFile" fileName="${LOG_PATH}/${LOG_FILE_NAME}.json"filePattern="${LOG_PATH}/${LOG_FILE_NAME}-%d{yyyy-MM-dd}-%i.json"><!-- <PatternLayout pattern="%d %p %C{1.} [%t] %m%n"/>--><JsonTemplateLayout eventTemplateUri="classpath:johnlogging/Log4j2JsonLayoutV4.json"/><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/><SizeBasedTriggeringPolicy size="10MB"/></Policies><DefaultRolloverStrategy max="10"/></RollingFile></Appenders><Loggers><!--additivity 屬性為“false”,表示在這個日志記錄器中,日志不會被發送到它的父級日志記錄器中--><Logger name="com.johnsport" level="info" additivity="false"><AppenderRef ref="Console" /><AppenderRef ref="JsonFile" /></Logger><Root level="INFO"><AppenderRef ref="Console"/><AppenderRef ref="JsonFile"/></Root></Loggers>
</Configuration>
Log4j2JsonLayout 自定義

resources 中的?johnlogging目錄下?Log4j2JsonLayoutV4.json 配置如下,這個里面的內容不能隨便寫,需要參考官方文檔中的定義,才能正確解析:JSON Template Layout :: Apache Log4j

{"timestamp": {"$resolver": "timestamp","pattern": {"format": "yyyy-MM-dd HH:mm:ss.SSS","timeZone": "Asia/Shanghai"}},"host": "${hostName:-unknown}","service": "${sys:service.name:-unknown}","level": {"$resolver": "level","field": "name"},"logger": {"$resolver": "logger","field": "name"},"source": {"$resolver": "source","field": "methodName"},"thread": {"$resolver": "thread","field": "name"},"message": {"$resolver": "message","stringified": true},"exception": {"$resolver": "exception","field": "stackTrace","stackTrace": {"stringified": {"truncation": {"suffix": "... [truncated]","pointMatcherStrings": ["servlet.http.HttpServlet"]}}}}
}

子使用模塊service-user的?application.yml 相關定義:

spring:application:name: service-user# ...logging:config:- classpath:log4j2-spring.xmllevel:root: info

3. 輸出樣例

在 指定的目錄生成了log文件, 名稱為?log_service-user.json

示例內容(手動格式化了下)如下:

{"timestamp": "2025-08-17 19:29:43.094","host": "johnwang","service": "service-user","level": "INFO","logger": "com.yourcompanyname.projname.ServiceUserApplication","thread": "main","message": "Starting ServiceUserApplication v1.0-SNAPSHOT using Java 17.0.15 with PID 41056 (E:\\Data\\code_dir\\v0\\projname_back\\service\\service-user\\target\\service-user-1.0-SNAPSHOT.jar started by jopc in E:\\Data\\code_dir\\v0\\projname_back)"
}
{"timestamp": "2025-08-17 19:29:43.103","host": "johnwang","service": "service-user","level": "DEBUG","logger": "com.yourcompanyname.projname.ServiceUserApplication","thread": "main","message": "Running with Spring Boot v3.3.2, Spring v6.1.11"
}
{"timestamp": "2025-08-17 19:29:43.105","host": "johnwang","service": "service-user","level": "INFO","logger": "com.yourcompanyname.projname.ServiceUserApplication","thread": "main","message": "The following 1 profile is active: \"dev\""
}
{"timestamp": "2025-08-17 19:29:43.184","host": "johnwang","service": "service-user","level": "WARN","logger": "com.alibaba.cloud.nacos.configdata.NacosConfigDataLoader","thread": "main","message": "[Nacos Config] config[dataId=service-user.yaml, group=DEFAULT_GROUP] is empty"
}
{"timestamp": "2025-08-17 19:29:46.083","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.data.repository.config.RepositoryConfigurationDelegate","thread": "main","message": "Multiple Spring Data modules found, entering strict repository configuration mode"
}
{"timestamp": "2025-08-17 19:29:46.087","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.data.repository.config.RepositoryConfigurationDelegate","thread": "main","message": "Bootstrapping Spring Data Redis repositories in DEFAULT mode."
}
{"timestamp": "2025-08-17 19:29:46.128","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.data.repository.config.RepositoryConfigurationDelegate","thread": "main","message": "Finished Spring Data repository scanning in 19 ms. Found 0 Redis repository interfaces."
}
{"timestamp": "2025-08-17 19:29:46.538","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.cloud.context.scope.GenericScope","thread": "main","message": "BeanFactory id=5e73db5d-3847-3fef-bba4-62fff8906613"
}
{"timestamp": "2025-08-17 19:29:48.414","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.boot.web.embedded.tomcat.TomcatWebServer","thread": "main","message": "Tomcat initialized with port 7203 (http)"
}
{"timestamp": "2025-08-17 19:29:48.451","host": "johnwang","service": "service-user","level": "INFO","logger": "org.apache.coyote.http11.Http11NioProtocol","thread": "main","message": "Initializing ProtocolHandler [\"http-nio-7203\"]"
}
{"timestamp": "2025-08-17 19:29:48.457","host": "johnwang","service": "service-user","level": "INFO","logger": "org.apache.catalina.core.StandardService","thread": "main","message": "Starting service [Tomcat]"
}
{"timestamp": "2025-08-17 19:29:48.458","host": "johnwang","service": "service-user","level": "INFO","logger": "org.apache.catalina.core.StandardEngine","thread": "main","message": "Starting Servlet engine: [Apache Tomcat/10.1.26]"
}
{"timestamp": "2025-08-17 19:29:48.560","host": "johnwang","service": "service-user","level": "INFO","logger": "org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]","thread": "main","message": "Initializing Spring embedded WebApplicationContext"
}
{"timestamp": "2025-08-17 19:29:48.563","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext","thread": "main","message": "Root WebApplicationContext: initialization completed in 5369 ms"
}
{"timestamp": "2025-08-17 19:29:49.451","host": "johnwang","service": "service-user","level": "DEBUG","logger": "com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean","thread": "main","message": "Registered plugin: 'MybatisPlusInterceptor{interceptors=[PaginationInnerInterceptor(logger=org.apache.ibatis.logging.slf4j.Slf4jImpl@2adce412, overflow=false, maxLimit=null, dbType=MYSQL, dialect=null, optimizeJoin=true), com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor@629cf53c]}'"
}
{"timestamp": "2025-08-17 19:29:49.456","host": "johnwang","service": "service-user","level": "DEBUG","logger": "com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean","thread": "main","message": "Property 'mapperLocations' was not specified."
}
{"timestamp": "2025-08-17 19:29:51.897","host": "johnwang","service": "service-user","level": "INFO","logger": "com.alibaba.cloud.sentinel.SentinelWebMvcConfigurer","thread": "main","message": "[Sentinel Starter] register SentinelWebInterceptor with urlPatterns: [/**]."
}
{"timestamp": "2025-08-17 19:29:56.239","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.boot.actuate.endpoint.web.EndpointLinksResolver","thread": "main","message": "Exposing 1 endpoint beneath base path '/actuator'"
}
{"timestamp": "2025-08-17 19:29:56.414","host": "johnwang","service": "service-user","level": "INFO","logger": "org.apache.coyote.http11.Http11NioProtocol","thread": "main","message": "Starting ProtocolHandler [\"http-nio-7203\"]"
}
{"timestamp": "2025-08-17 19:29:56.439","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.boot.web.embedded.tomcat.TomcatWebServer","thread": "main","message": "Tomcat started on port 7203 (http) with context path '/'"
}
{"timestamp": "2025-08-17 19:29:56.771","host": "johnwang","service": "service-user","level": "INFO","logger": "com.alibaba.cloud.nacos.registry.NacosServiceRegistry","thread": "main","message": "nacos registry, DEFAULT_GROUP service-user 192.168.171.1:7203 register finished"
}
{"timestamp": "2025-08-17 19:29:57.606","host": "johnwang","service": "service-user","level": "INFO","logger": "com.yourcompanyname.projname.ServiceUserApplication","thread": "main","message": "Started ServiceUserApplication in 20.963 seconds (process running for 23.326)"
}
{"timestamp": "2025-08-17 19:29:57.724","host": "johnwang","service": "service-user","level": "INFO","logger": "com.alibaba.cloud.nacos.refresh.NacosContextRefresher","thread": "main","message": "[Nacos Config] Listening config: dataId=service-user.yaml, group=DEFAULT_GROUP"
}
{"timestamp": "2025-08-17 19:30:10.982","host": "johnwang","service": "service-user","level": "INFO","logger": "org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/]","thread": "http-nio-7203-exec-1","message": "Initializing Spring DispatcherServlet 'dispatcherServlet'"
}
{"timestamp": "2025-08-17 19:30:10.982","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.web.servlet.DispatcherServlet","thread": "http-nio-7203-exec-1","message": "Initializing Servlet 'dispatcherServlet'"
}
{"timestamp": "2025-08-17 19:30:10.986","host": "johnwang","service": "service-user","level": "INFO","logger": "org.springframework.web.servlet.DispatcherServlet","thread": "http-nio-7203-exec-1","message": "Completed initialization in 3 ms"
}
{"timestamp": "2025-08-17 19:30:11.581","host": "johnwang","service": "service-user","level": "INFO","logger": "com.zaxxer.hikari.HikariDataSource","thread": "http-nio-7203-exec-1","message": "HikariCP - Starting..."
}
{"timestamp": "2025-08-17 19:30:12.007","host": "johnwang","service": "service-user","level": "INFO","logger": "com.zaxxer.hikari.pool.HikariPool","thread": "http-nio-7203-exec-1","message": "HikariCP - Added connection com.mysql.cj.jdbc.ConnectionImpl@d123cb8"
}
{"timestamp": "2025-08-17 19:30:12.014","host": "johnwang","service": "service-user","level": "INFO","logger": "com.zaxxer.hikari.HikariDataSource","thread": "http-nio-7203-exec-1","message": "HikariCP - Start completed."
}
{"timestamp": "2025-08-17 19:30:12.314","host": "johnwang","service": "service-user","level": "INFO","logger": "com.yourcompanyname.projname.guess.controller.GuessUserController","thread": "http-nio-7203-exec-1","message": "This is an info log test"
}
{"timestamp": "2025-08-17 19:30:12.314","host": "johnwang","service": "service-user","level": "WARN","logger": "com.yourcompanyname.projname.guess.controller.GuessUserController","thread": "http-nio-7203-exec-1","message": "This is a warn log test"
}
{"timestamp": "2025-08-17 19:30:41.521","host": "johnwang","service": "service-user","level": "INFO","logger": "com.yourcompanyname.projname.guess.controller.LogTestController","thread": "http-nio-7203-exec-2","message": "This is an info message"
}
{"timestamp": "2025-08-17 19:30:41.523","host": "johnwang","service": "service-user","level": "ERROR","logger": "com.yourcompanyname.projname.guess.controller.LogTestController","thread": "http-nio-7203-exec-2","message": "Division error occurred","exception": "java.lang.ArithmeticException: / by zero\r\n\tat com.yourcompanyname.projname.guess.controller.LogTestController.testLog(LogTestController.java:40)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\r\n\tat java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)\r\n\tat java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\r\n\tat java.base/java.lang.reflect.Method.invoke(Method.java:568)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255)\r\n\tat org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:926)\r\n\tat org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:831)\r\n\tat org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1089)\r\n\tat org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:979)\r\n\tat org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1014)\r\n\tat org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:903)\r\n\tat jakarta.servlet.http.HttpServlet\r\n... [truncated]"
}

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

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

相關文章

記錄Webapi Excel 導出

文章目錄1、helper2、control3、前端 axios記錄webapi excel 導出File示例.NET8.0 NPOI2.731、helper using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.Data; using System.IO; /// <summary> /// 導出EXCEL /// </summary> public class Exce…

VPS服務器安全審計方案:從風險評估到防護實施

隨著云計算技術的快速發展&#xff0c;VPS服務器已成為企業信息化建設的重要基礎設施。隨之而來的安全威脅也日益增多&#xff0c;如何通過專業的安全審計方案保障VPS服務器的穩定運行成為關鍵課題。本文將系統闡述從漏洞掃描到應急響應的全周期安全審計實施策略&#xff0c;幫…

libmicrohttpd 入門

libmicrohttpd 是一個小型的 C 庫&#xff0c;用于在項目中嵌入 HTTP 服務器功能。它設計簡單、輕量級&#xff0c;適合需要 HTTP 接口但不想要大型 Web 服務器開銷的應用程序。 安裝 libmicrohttpd Linux 系統 在基于 Debian/Ubuntu 的系統上&#xff1a; bash sudo apt-…

【網絡】使用 DNAT 進行負載均衡時,若未配置配套的 SNAT,回包失敗

【網絡】iptables 1 概念 【網絡】iptables 2 查看規則 【網絡】使用 DNAT 進行負載均衡時&#xff0c;若未配置配套的 SNAT&#xff0c;回包失敗 【網絡】回包路由原理 使用 DNAT 進行負載均衡時&#xff0c;若未配置配套的 SNAT&#xff0c;后端服務器將直接回包給客戶端&am…

深入解析GCC:從編譯原理到嵌入式底層實戰

繼續更新編譯器底層系列&#xff01;&#xff01;&#xff01;硬核C語言的屠龍之術&#xff1a;從GCC到匯編的底層征途&#xff08;一&#xff09;總綱&#xff1a; 恭喜你&#xff0c;決定踏上這條通往嵌入式大佬的硬核之路。這條路的起點&#xff0c;不是C語言的語法書&#…

最新MySQL面試題(2025超詳細版)

2025最新超詳細MySQL面試題 文章目錄2025最新超詳細MySQL面試題[toc]一、 SQL 和基本操作1. SQL的執行順序2. 如何優化MySQL查詢3. 常用的聚合函數4. 數據庫事務5. 事務的四大特性(ACID)6. 視圖7. MySQL中使用LIMIT子句進行分頁8. MySQL中使用變量和用戶定義的函數9. MySQL中的…

Spring Retry實戰指南_讓你的應用更具韌性

1 Spring Retry概述 1.1 什么是Spring Retry Spring Retry是Spring生態系統中的一個重要組件,專門用于處理應用程序中的重試邏輯。在分布式系統和微服務架構中,網絡通信、外部服務調用、數據庫訪問等操作都可能因為各種原因而失敗,如網絡抖動、服務暫時不可用、資源競爭等…

大數據畢業設計選題推薦-基于大數據的1688商品類目關系分析與可視化系統-Hadoop-Spark-數據可視化-BigData

?作者主頁&#xff1a;IT畢設夢工廠? 個人簡介&#xff1a;曾從事計算機專業培訓教學&#xff0c;擅長Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等項目實戰。接項目定制開發、代碼講解、答辯教學、文檔編寫、降重等。 ?文末獲取源碼? 精彩專欄推薦?…

【Grafana】grafana-image-renderer配合python腳本實現儀表盤導出pdf

背景 os&#xff1a;centos7Grafana&#xff1a;v12grafana-image-renderer&#xff1a;v4.0.10插件&#xff1a;否grafana-image-renderer可以以插件形式啟動&#xff0c;也可以以單獨服務啟動&#xff0c;在centos7插件啟動時&#xff0c;報錯glibc版本太低&#xff0c;未找到…

靜/動態庫 IIC(arm) day58

十七&#xff1a;動態庫和靜態庫 庫&#xff1a;一堆可執行二進制文件的集合&#xff0c;由若干個.o文件歸并生成 一&#xff1a;靜態(鏈接)庫&#xff1a;libxxx.a 生成一個獨立的可執行程序(運行時僅需要一個文件即可) 使用方便 不需要安裝 文件比較大 多個程序使用同一個靜態…

uniapp 手寫簽名組件開發全攻略

引言在移動應用開發中&#xff0c;手寫簽名功能是一個常見的需求&#xff0c;特別是在電子合同、審批流程、金融交易等場景中。本文將詳細介紹如何基于uni-app框架開發一個高性能、功能豐富的手寫簽名組件&#xff0c;并分享開發過程中的技術要點和最佳實踐。組件概述這個簽名組…

理解JavaScript中的函數賦值和調用

&#x1f468; 作者簡介&#xff1a;大家好&#xff0c;我是Taro&#xff0c;全棧領域創作者 ?? 個人主頁&#xff1a;唐璜Taro &#x1f680; 支持我&#xff1a;點贊&#x1f44d;&#x1f4dd; 評論 ??收藏 文章目錄前言一、函數賦值二、函數調用三、 代碼示例總結前言…

交叉編譯 手動安裝 SQLite 庫 移植ARM

# 下載源碼 wget https://www.sqlite.org/2023/sqlite-autoconf-3420000.tar.gz tar -xzf sqlite-autoconf-3420000.tar.gz cd sqlite-autoconf-3420000cd /home/lxh/sqlite-autoconf-3420000 make distclean //清除下&#xff0c;因為我安裝失敗過。 ./configure --hostarm-…

翻譯記憶庫(TMX)與機器翻譯的結合應用

更多內容請見: 機器翻譯修煉-專欄介紹和目錄 文章目錄 一、核心概念解析 1.1 翻譯記憶庫 (Translation Memory, TM) 1.2 翻譯記憶交換格式 (Translation Memory eXchange, TMX) 二、為何要將兩者結合? 2.1 TM和MT的優勢是高度互補的 2.2 TMX在結合中的關鍵作用 2.3 TMX與MT的…

SpringBoot中集成eclipse.paho.client.mqttv3實現mqtt客戶端并支持斷線重連、線程池高并發改造、存儲入庫mqsql和redis示例業務流程,附資源下載

場景 SpringBoot整合MQTT服務器實現消息的發送與訂閱(推送消息與接收推送)&#xff1a; SpringBoot整合MQTT服務器實現消息的發送與訂閱(推送消息與接收推送)_服務端接收mqtt消息-CSDN博客 上面SpringBoot集成MQTT使用的是spring-integration-mqtt依賴&#xff0c;也是經常使…

【考研408數據結構-08】 圖論基礎:存儲結構與遍歷算法

&#x1f4da; 【考研408數據結構-08】 圖論基礎&#xff1a;存儲結構與遍歷算法 &#x1f3af; 考頻&#xff1a;????? | 題型&#xff1a;選擇題、綜合應用題、算法設計題 | 分值&#xff1a;約8-15分 引言 想象你正在規劃一次跨省自駕游&#xff0c;面前攤開一張復雜的…

SQL查詢語句的執行順序

好的&#xff0c;我們來詳細講解一下 SQL 查詢語句的執行順序。 很多人會誤以為 SQL 的執行順序就是我們寫的順序&#xff08;SELECT -> FROM -> WHERE -> GROUP BY -> HAVING -> ORDER BY&#xff09;&#xff0c;但實際上&#xff0c;數據庫引擎在底層處理查詢…

【Android】OKHttp網絡請求原理和弱網優化

【Android】OKHttp網絡請求原理和弱網優化 1. OkHttp 網絡請求原理 OkHttp 的請求過程可以分為 四個關鍵階段&#xff1a; &#xff08;假設你是通過 OkHttpClient.newCall(request).enqueue(callback) 發的請求&#xff09; OkHttpClient│▼ Dispatcher (調度器)│▼ RealC…

概率論基礎教程第4章 隨機變量(四)

4.7 泊松隨機變量 定義 泊松隨機變量&#xff1a;如果一個取值于 $ 0, 1, 2, \ldots $ 的隨機變量對某一個 $ \lambda > 0 $&#xff0c;其分布列為&#xff1a; p(i)P{Xi}e?λλii!i0,1,2,?(7.1) \boxed{p(i) P\{X i\} e^{-\lambda} \frac{\lambda^i}{i!} \qquad i 0…

Unity高級開發:反射原理深入解析與實踐指南 C#

Unity高級開發&#xff1a;反射原理深入解析與實踐指南 在Unity游戲開發中&#xff0c;反射&#xff08;Reflection&#xff09; 是一項強大的元編程技術&#xff0c;它允許程序在運行時動態地獲取類型信息、創建對象和調用方法。根據Unity官方統計&#xff0c;超過78%的商業游…