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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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%的商业游…