Spring Boot 日志管理(官网文档解读)
摘要
本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。
日志实现方式
Sping Boot 的日志管理框架采用的是Apache Commons Logging,是Apache软件基金会下的一个开源的日志门面框架。日志门面框架并不直接实现日志的具体功能,而是为不同的日志实现框架提供统一的接口。Spring Boot 为Java.Util.Logging、Log4j2和Logback提供了默认配置,在每种配置情况下,记录器都预先配置为使用控制台输出,也可选择文件输出。
默认情况下,如果你使用的是Spring Boot的 Starters启动,则会使用 Logback 进行日志记录。Spring Boot 会配置适当的Logback 路由,以确保其他日志框架如 Java Util Logging、Commons Logging、Log4J 的依赖库均能正常工作。
Spring Boot 默认日志格式
Spring Boot 的默认日志格式包含如下内容:
-
日期和时间:精确到毫秒,便于排序。
-
日志级别:包括 ERROR、WARN、INFO、DEBUG 或 TRACE。
-
进程 ID。
-
一个 "---" 分隔符,用于区分实际日志消息的开始。
-
应用程序名称:用方括号括起来(默认情况下,仅当设置了 spring.application.name 时才记录)
-
应用程序组:用方括号括起来(默认情况下,仅当设置了 spring.application.group 时才记录)
-
线程名称:用方括号括起来(在控制台输出中可能会被截断)。
-
关联 ID:如果启用了跟踪(上述示例中未显示)
-
记录器名称:通常是源类名(经常被缩写)。
-
日志消息。
Spring Boot 日志配置
日志级别
Spring Boot 支持以下日志级别:
-
ERROR(错误):该级别用于记录系统中发生的严重错误事件,这些错误会导致系统无法正常运行或部分功能失效,通常需要立即关注和处理。
-
WARN(警告):表示系统中出现了一些可能会导致问题的情况,但当前系统仍能继续运行。这些情况虽然不会立即影响系统的正常功能,但需要引起注意,因为它们可能是潜在问题的征兆。
-
INFO(信息):用于记录系统运行过程中的一些重要信息,这些信息可以帮助开发者和运维人员了解系统的基本运行状态和关键操作的执行情况。
-
DEBUG(调试):主要用于开发和调试阶段,记录系统运行过程中的详细信息,帮助开发者定位和解决问题。这些信息通常包含变量的值、方法的调用顺序、程序的执行路径等。
-
TRACE(跟踪):这是最详细的日志级别,用于记录系统运行过程中的每一个细节,包括方法的进入和退出、变量的微小变化等。它提供了比 DEBUG 级别更精细的信息。
-
FATAL: 是所有日志级别中最为严重的一级。当系统记录 FATAL 级别的日志时,意味着系统遭遇到了几乎无法恢复的灾难性错误,整个系统或者关键业务功能已经完全崩溃,无法继续提供正常服务。
-
Logback 没有 FATAL级别,它会将FATAL 映射到ERROR。
-
日志级别默认的颜色配置
如果您的终端支持ANSI,则使用彩色输出来提高可读性。以下是日志级别默认的颜色配置列表:
等级 | 颜色 |
---|---|
| 红色的 |
| 红色的 |
| 黄色的 |
| 绿色的 |
| 绿色的 |
| 绿色的 |
日志级别启动配置
Spring Boot 的日志默认会回显到控制台,并会记录日志级别是 ERROR、WARN、INFO level的日志。
-
启动debug日志
-
$ java -jar myapp.jar --debug 在启动应用程序的时候使用 --debug 标志
-
在application.properties配置文件中配置 debug=true
-
-
启动trace日志
-
$ java -jar myapp.jar --trace 在启动应用程序的时候使用 --trace 标志
-
在application.properties配置文件中配置 trace=true
-
配置某个模块的日志级别
我们可以使用 logging.level.<logger-name>=<level> 语法,配置某个模块的日志级别。以下是一些配置示例:
logging.level.root=warn # 配置根日志记录器的日志级别
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
文件输出配置
-
logging.file.name:
-
属性用于指定日志文件的完整名称和路径,它会精确地定义日志文件在文件系统中的存储位置和文件名。当你设置了这个属性后,Spring Boot 会将日志信息输出到该指定的文件中。
-
logging.file.name=/var/log/myapp.log
-
这会让 Spring Boot 把日志信息输出到
/var/log
目录下名为myapp.log
的文件中。如果指定的目录不存在,Spring Boot 不会自动创建该目录,而是会抛出异常。
-
-
logging.file.path:
-
属性用于指定日志文件的存储目录,Spring Boot 会在该目录下生成默认名为
spring.log
的日志文件。使用这个属性时,你只需关注日志文件的存储位置,而无需指定具体的文件名。 -
logging.file.path=/var/log/myapp
-
这会让 Spring Boot 在
/var/log/myapp
目录下创建spring.log
文件,并将日志信息写入该文件。如果指定的目录不存在,Spring Boot 会自动创建该目录。
-
-
配置优先级:如果同时配置了
logging.file.name
和logging.file.path
,logging.file.name
的优先级更高,Spring Boot 会按照logging.file.name
指定的路径和文件名生成日志文件,而忽略logging.file.path
的设置。
文件轮换规则配置(仅限Logback)
- 默认日志文件轮换:Spring Boot的默认日志文件记录大小是10MB
- 对于Logback 日志框架,Spring Boot 提供了一些可用于微调的文件日志轮换配置。而对于其他日志系统,则需要在配置文件中自行配置日志轮换规则。以下是关于Spring Boot文件轮换规则的配置列表:
-
属性
描述
logging.logback.rollingpolicy.file-name-pattern
用于创建日志档案的文件名模式。
logging.logback.rollingpolicy.clean-history-on-start
如果日志存档清理应该在应用程序启动时发生。
logging.logback.rollingpolicy.max-file-size
日志文件归档前的最大大小。
logging.logback.rollingpolicy.total-size-cap
日志存档在被删除前可容纳的最大大小。
logging.logback.rollingpolicy.max-history
要保留的存档日志文件的最大数量(默认为 7)。
日志分组
-
在 Spring Boot 中,将相关的日志记录器分组,以便同时对它们进行配置是很有用的。例如,你可能经常需要更改所有与 Tomcat 相关的日志记录器的日志级别,但又难以记住顶级包名。
-
为解决这个问题,Spring Boot 允许在 Spring 环境中定义日志组。例如,可在
application.properties
中添加如下内容来定义一个名为 “tomcat” 的日志组:
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
-
定义好日志组后,只需一行配置就能更改该组中所有日志记录器的日志级别,示例如下:
logging.level.tomcat=trace
-
此外,Spring Boot 还包含一些预定义的日志组,可直接使用,具体如下:
名称 | 包含的日志记录器 |
---|---|
web |
|
sql |
|
自定义日志配置
-
激活与自定义方式:不同日志系统可通过在类路径包含相应库来激活,还能在类路径根目录提供合适配置文件,或通过
logging.config
属性指定配置文件位置来进一步自定义。-
logging: config: classpath:custom-logback
-
然后在
src/main/resources
目录下创建custom-logback.xml
文件
-
-
强制指定日志系统:可使用
org.springframework.boot.logging.LoggingSystem
系统属性强制 Spring Boot 使用特定日志系统,值为LoggingSystem
实现类的全限定名,设置为none
可完全禁用 Spring Boot 的日志配置。-
import org.springframework.boot.Banner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder;@SpringBootApplication public class CustomLoggingSystemApplication {public static void main(String[] args) {// 强制指定使用 Log4j2 日志系统System.setProperty("org.springframework.boot.logging.LoggingSystem", "org.springframework.boot.logging.log4j2.Log4j2LoggingSystem");// 禁用 Spring Boot 的日志配置// System.setProperty("org.springframework.boot.logging.LoggingSystem", "none");new SpringApplicationBuilder(CustomLoggingSystemApplication.class).bannerMode(Banner.Mode.OFF).run(args);} }
-
-
配置限制:由于日志在
ApplicationContext
创建前初始化,不能通过 Spring@Configuration
文件里的@PropertySources
控制日志,只能通过系统属性更改或禁用日志系统。
不同日志系统加载的文件
日志系统 | 加载文件 |
---|---|
Logback | logback-spring.xml 、logback-spring.groovy 、logback.xml 、logback.groovy |
Log4j2 | log4j2-spring.xml 、log4j2.xml |
JDK(Java Util Logging) | logging.properties |
-
建议优先使用
-spring
变体的配置文件(例如,logback-spring.xml
而不是logback.xml)
,使用标准配置位置时 Spring 无法完全控制日志初始化,且运行 “可执行 jar” 时 Java Util Logging 存在类加载问题,建议尽量避免。
环境属性与系统属性映射
Spring 环境中的一些属性会被转移到系统属性,供日志系统配置使用。以下是环境属性映射到系统属性的列表:
Spring 环境属性 | 系统属性 | 评论 |
---|---|---|
|
| 记录异常时使用的转换字。 |
|
| 如果定义了,则在默认日志配置中使用它。 |
|
| 如果定义了,则在默认日志配置中使用它。 |
|
| 控制台 (stdout) 上使用的日志模式。 |
|
| 日志日期格式的附加器模式。 |
|
| 用于控制台日志记录的字符集。 |
|
| 用于控制台日志记录的日志级别阈值。 |
|
| 文件中使用的日志模式(如果 |
|
| 用于文件记录的字符集(如果 |
|
| 用于文件日志记录的日志级别阈值。 |
|
| 呈现日志级别时使用的格式(默认 |
|
| 用于控制台日志记录的结构化日志记录格式。 |
|
| 用于文件日志记录的结构化日志记录格式。 |
|
| 当前进程 ID(如果可能并且尚未定义为操作系统环境变量则发现)。 |
如果您使用 Logback,以下属性也会被转移:
Spring 环境属性 | 系统属性 | 评论 |
---|---|---|
|
| 滚动日志文件名的模式(默认 |
|
| 是否在启动时清理存档日志文件。 |
|
| 最大日志文件大小。 |
|
| 要保留的日志备份的总大小。 |
|
| 要保留的最大存档日志文件数。 |
其它配置
不为日志配置spring.application.name
logging.include-application-name=
false
不为日志配置spring.application.group
logging.include-application-group=
false
结构化日志
-
结构化日志是一种将日志输出以明确定义、通常为机器可读的格式进行记录的技术。
-
Spring Boot 原生支持以下几种 JSON 格式的结构化日志:
-
Elastic Common Schema (ECS):一种通用的、标准化的日志数据结构,便于在 Elastic Stack 中进行统一的日志分析和处理。
-
Graylog Extended Log Format (GELF):Graylog 日志管理系统所使用的扩展日志格式,能高效地传输和存储日志数据。
-
Logstash:一个开源的数据收集引擎,可对日志进行收集、过滤和转换。
-
启用结构化日志的方法
可通过设置以下属性来启用结构化日志:
-
logging.structured.format.console
:用于控制台输出,将其设置为所需格式的标识符。 -
logging.structured.format.file
:用于文件输出,同样设置为所需格式的标识符
自定义日志配置时的处理
如果使用自定义日志配置,需要更新配置以遵循 CONSOLE_LOG_STRUCTURED_FORMAT
和 FILE_LOG_STRUCTURED_FORMAT
系统属性。以 CONSOLE_LOG_STRUCTURED_FORMAT
为例,在 Logback 和 Log4j2 中,需要将编码器替换为 StructuredLogEncoder
,示例配置如下:
<encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder"><format>${CONSOLE_LOG_STRUCTURED_FORMAT}</format><charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
参考默认配置
可以参考 Spring Boot 中包含的默认配置,如:
- Logback Structured Console Appender:Logback 的结构化控制台输出附加器配置。
<?xml version="1.0" encoding="UTF-8"?>
<!--
Console appender with structured logging logback configuration provided for import,
equivalent to the programmatic initialization performed by Boot
--><included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${CONSOLE_LOG_THRESHOLD}</level>
</filter>
<encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder">
<format>${CONSOLE_LOG_STRUCTURED_FORMAT}</format>
<charset>${CONSOLE_LOG_CHARSET}</charset>
</encoder>
</appender>
</included>
- Logback Structured File Appender:Logback 的结构化文件输出附加器配置。
<?xml version="1.0" encoding="UTF-8"?>
<!--
File appender with structured logging logback configuration provided for import,
equivalent to the programmatic initialization performed by Boot
--><included>
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${FILE_LOG_THRESHOLD}</level>
</filter>
<encoder class="org.springframework.boot.logging.logback.StructuredLogEncoder">
<format>${FILE_LOG_STRUCTURED_FORMAT}</format>
<charset>${FILE_LOG_CHARSET}</charset>
</encoder>
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-7}</maxHistory>
</rollingPolicy>
</appender>
</included>
弹性通用模式(ECS)
-
ECS 格式简介:Elastic Common Schema 是一种基于 JSON 的日志记录格式。
-
启用 ECS 格式:在配置文件(如
application.properties
或application.yml
)中,将logging.structured.format.console
和logging.structured.format.file
属性设置为ecs
,即可启用该日志格式。
logging.structured.format.console=ecs
logging.structured.format.file=ecs
-
日志示例:启用 ECS 格式后,日志行呈现为 JSON 对象,包含时间戳、日志级别、进程 ID、线程名、服务名、日志记录器、消息内容和 ECS 版本等信息。
{"@timestamp":"2024-01-01T10:15:00.067462556Z","log.level":"INFO","process.pid":39599,"process.thread.name":"main","service.name":"simple","log.logger":"org.example.Application","message":"No active profile set, falling back to 1 default profile: \"default\"","ecs.version":"8.11"}
-
数据添加方法:这种格式会将 MDC(Mapped Diagnostic Context)中的每个键值对添加到 JSON 对象中。此外,还能使用 SLF4J 流式日志记录 API 的
addKeyValue
方法,向记录的 JSON 对象添加键值对。 -
服务属性自定义:可使用
logging.structured.ecs.service
相关属性对服务值进行自定义,如服务名、版本、环境和节点名等。若未指定服务名和版本,将分别默认使用spring.application.name
和spring.application.version
。
logging.structured.ecs.service.name=MyService
logging.structured.ecs.service.version=1 logging.structured.ecs.service.environment=Production logging.structured.ecs.service.node-name=Primary
Graylog 拓展日志格式(GELF)
-
GELF 格式定义:Graylog 扩展日志格式(GELF)是一种基于 JSON 的日志记录格式,专为 Graylog 日志分析平台设计。
-
启用 GELF 格式:在配置文件(如
application.properties
或application.yml
)中,将logging.structured.format.console
和logging.structured.format.file
属性设置为gelf
,即可启用该日志格式。
logging.structured.format.console=gelf
logging.structured.format.file=gelf
-
日志示例:启用 GELF 格式后,日志行呈现为 JSON 对象,包含版本、短消息、时间戳、日志级别、进程 ID、线程名和日志记录器等信息。
{"version":"1.1","short_message":"No active profile set, falling back to 1 default profile: \"default\"","timestamp":1725958035.857,"level":6,"_level_name":"INFO","_process_pid":47649,"_process_thread_name":"main","_log_logger":"org.example.Application"}
-
数据添加方法:这种格式会将 MDC(Mapped Diagnostic Context)中的每个键值对添加到 JSON 对象中。此外,还能使用 SLF4J 流式日志记录 API 的
addKeyValue
方法,向记录的 JSON 对象添加键值对。 -
字段自定义:可使用
logging.structured.gelf
相关属性对部分字段进行自定义,如主机名和服务版本。若未指定主机名和服务版本,将分别默认使用spring.application.name
和spring.application.version
。
logging.structured.gelf.host=MyService
logging.structured.gelf.service.version=1
Logstash JSON 格式
-
格式定义:Logstash JSON 格式是一种基于 JSON 的日志记录格式。
-
启用方式:在配置文件中,可通过设置
logging.structured.format.console=logstash
和logging.structured.format.file=logstash
来分别启用控制台和文件输出的 Logstash JSON 日志格式。
logging.structured.format.console=logstash
logging.structured.format.file=logstash
-
日志示例
{"@timestamp":"2024-01-01T10:15:00.111037681+02:00","@version":"1","message":"No active profile set, falling back to 1 default profile: \"default\"","logger_name":"org.example.Application","thread_name":"main","level":"INFO","level_value":20000}
-
数据添加:MDC 键值对:该格式会将 MDC(Mapped Diagnostic Context)中包含的每个键值对添加到 JSON 对象中。还能使用 SLF4J 流式日志记录 API 的
addKeyValue
方法,向记录的 JSON 对象添加键值对。 -
标记处理:若添加了标记(markers),这些标记会以字符串数组的形式出现在 JSON 的
tags
字段中。
自定义结构化日志
-
Spring Boot 会为结构化日志的 JSON 名称和值选择合理的默认设置,但有时用户可能需要根据自身需求对 JSON 进行微调,比如更改某些名称以匹配日志摄入系统的要求,或者过滤掉一些无用的成员。
-
常用自定义属性及功能
属性 | 描述 |
---|---|
| 用于过滤 JSON 中的特定路径,排除或包含指定内容 |
| 对 JSON 中的特定成员进行重命名 |
| 向 JSON 中添加额外的成员 |
-
配置示例:可以通过如下配置排除
log.level
,将process.id
重命名为procid
,并添加一个固定的corpname
字段:
logging.structured.json.exclude=log.level
logging.structured.json.rename.process.id=procid
logging.structured.json.add.corpname=mycorp
-
高级自定义方式:对于更高级的自定义需求,用户可以编写实现
StructuredLoggingJsonMembersCustomizer
接口的类,并通过logging.structured.json.customizer
属性声明该类。此外,也可以在META - INF/spring.factories
文件中列出这些实现类来完成声明。
其它结构化日志的支持
-
Spring Boot 的结构化日志支持具有扩展性,允许用户定义自己的自定义格式。实现方式为实现
StructuredLogFormatter
接口,不过要注意,使用 Logback 时泛型类型参数需为ILoggingEvent
,使用 Log4j2 时则为LogEvent
,这意味着实现会与特定的日志系统绑定。 -
示例代码:
class MyCustomFormat implements StructuredLogFormatter<ILoggingEvent> {@Overridepublic String format(ILoggingEvent event) {return "time=" + event.getInstant() + " level=" + event.getLevel() + " message=" + event.getMessage() + "\n";}}
-
启用自定义格式:要启用自定义格式,需将
logging.structured.format.console
或logging.structured.format.file
属性设置为自定义实现类的全限定类名。 -
构造参数注入:自定义实现类可以使用构造参数,这些参数会被自动注入,更多详细信息可查看 StructuredLogFormatter 的 JavaDoc。
Logback拓展
-
文件选择:标准的
logback.xml
配置文件加载过早,无法使用这些扩展,需要使用logback-spring.xml
或者通过定义logging.config
属性来指定配置文件。 -
配置扫描限制:这些扩展不能与 Logback 的配置扫描功能一起使用。
特定环境配置(<springProfile>
标签)
-
功能:
<springProfile>
标签允许根据激活的 Spring 配置文件有选择地包含或排除部分配置内容。配置文件相关部分可在<configuration>
元素内的任何位置使用。 -
属性使用:使用
name
属性指定接受该配置的配置文件。name
属性可以是单个配置文件名称(如staging
),也可以是配置文件表达式,配置文件表达式能实现更复杂的配置文件逻辑,例如production & (eu - central | eu - west)
。更多详细信息可查看 Spring Framework 参考指南。 -
示例:
<springProfile name="staging"><!-- 当 "staging" 配置文件激活时启用的配置 -->
</springProfile><springProfile name="dev | staging"><!-- 当 "dev" 或 "staging" 配置文件激活时启用的配置 -->
</springProfile><springProfile name="!production"><!-- 当 "production" 配置文件未激活时启用的配置 -->
</springProfile>
环境属性配置(<springProperty>
标签)
-
功能:
<springProperty>
标签可将 Spring 环境中的属性暴露出来,以便在 Logback 中使用。若想在 Logback 配置中访问application.properties
文件中的值,该标签会很有用。 -
使用方式:其工作方式与 Logback 的标准
<property>
标签类似,但不是直接指定值,而是指定属性的来源(来自环境)。 -
额外属性:若需要将属性存储在本地作用域之外的地方,可使用
scope
属性;若需要一个备用值(以防环境中未设置该属性),可使用defaultValue
属性。 -
示例:
<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender"><remoteHost>${fluentHost}</remoteHost>...
</appender>
-
属性格式:
source
必须使用短横线命名法(如my.property - name
),不过可以通过宽松规则将属性添加到环境中。
Log4j2拓展
-
Spring Boot 包含许多 Log4j2 扩展,可帮助进行高级配置。您可以在任何
log4j2-spring.xml
配置文件中使用这些扩展。
特定环境配置(<springProfile>
标签):
-
同Logback特定环境配置介绍内容。
环境属性配置
-
如果您想在 Log4j2 配置中引用 Spring 的属性,则可以使用
spring:前缀查找方法
-
配置示例
<Properties>
<Property name="applicationName">${spring:spring.application.name}</Property> <Property name="applicationGroup">${spring:spring.application.group}</Property> </Properties>
系统属性配置
-
Log4j2 系统属性支持:Log4j2 支持多个系统属性,可用于配置不同的项目。例如,
log4j2.skipJansi
系统属性可用于配置ConsoleAppender
在 Windows 系统上是否尝试使用 Jansi 输出流。
log4j2.skipJansi=false
-
从 Spring 环境获取系统属性:在 Log4j2 初始化之后加载的所有系统属性都可以从 Spring 环境中获取。可以在
application.properties
文件中添加相应的系统属性配置,这样就能借助 Spring 环境来影响 Log4j2 的行为。 -
属性加载优先级:只有当系统属性和操作系统环境变量中不包含要加载的值时,才会考虑 Spring 环境。
-
早期初始化的系统属性限制:在 Log4j2 早期初始化期间加载的系统属性不能引用 Spring 环境,因为这些属性在 Spring 环境可用之前就已被使用。
参考文献
Logging :: Spring Boot
相关文章:
Spring Boot 日志管理(官网文档解读)
摘要 本篇文章详细介绍了SpringBoot 日志管理相关的内容,文章主要参考官网文章的描述内容,并在其基础上进行一定的总结和拓展,以方便学习Spring Boot 的小伙伴能快速掌握Spring Boot 日志管理相关的内容。 日志实现方式 Sping Boot 的日志管…...
Svelte 最新中文文档教程(17)—— 生命周期钩子
前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1: Svelte 以…...
Windows 上源码安装 FastGPT
FastGPT 是一个强大的 AI RAG 平台,值得我们去学习了解。与常见的 Python 体系不同,Fast GPT 采用 Node.js/Next.js 平台(对于广大 JS 开发者或前端开发者比较亲切友好),安装或部署比较简单。虽然一般情况下推荐简单的…...
RT-Thread+STM32L475VET6——icm20608传感器
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开I2C3,参数默认即可(I2C根据自己需求调整)1.3 打开串口1.4 生成工程 2. 添加icm20608软件包3. 使能传感器,打开动态链接库4.…...
超高清大图渲染性能优化实战:从页面卡死到流畅加载
目录 问题背景:1.为什么大图会导致页面卡死?一、DOM树构建(HTML Parsing)二、 资源加载:下载完整图片文件(可能高达30MB)三、解码处理(Decoding & Rasterization)、四…...
基于javaweb的SpringBoot个人博客系统设计和实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
轻量级日志管理平台Grafana Loki
文章目录 轻量级日志管理平台Grafana Loki背景什么是Loki为什么使用 Grafana Loki?架构Log Storage Grafana部署使用基于 Docker Compose 安装 LokiMinIO K8s集群部署Loki采集Helm 部署方式和案例 参考 轻量级日志管理平台Grafana Loki 背景 在微服务以及云原生时…...
SOME/IP--协议英文原文讲解12(完结)
前言 SOME/IP协议越来越多的用于汽车电子行业中,关于协议详细完全的中文资料却没有,所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块: 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 4.3 Compa…...
Linux 命令大全完整版(12)
Linux 命令大全 5. 文件管理命令 ln(link) 功能说明:连接文件或目录。语 法:ln [-bdfinsv][-S <字尾备份字符串>][-V <备份方式>][--help][--version][源文件或目录][目标文件或目录] 或 ln [-bdfinsv][-S <字尾备份字符串>][-V…...
AI学习第二,三天-Python基础
变量、运算符与数据类型详解 注释 在 Python 中,注释是用于增加代码可读性、解释代码功能但不会被程序执行的部分。 单行注释:使用 # 符号,从 # 开始到本行末尾的内容均为注释。例如: 收起 python # 这是一个单行注释ÿ…...
Nginx代理ElasticSearch
1、将ES的账号:密码通过Base64加密 假设账号密码如下: 账号:elastic密码:elastichuayunworld.com echo -n elastic:elastichuayunworld.com | base64 ZWxhc3RpYzplbGFzdGljQGh1YXl1bndvcmxkLmNvbQ2、在 Nginx 配置中传递认证信息 locatio…...
开源AI网络爬虫工具Crawl4AI
引言 在信息化时代,网络爬虫作为从互联网中提取信息的重要工具,扮演着至关重要的角色。Crawl4AI作为一款开源AI网络爬虫工具,凭借其功能强大和易用性,受到了广泛关注。本文将详细探讨Crawl4AI的定义、特点、优势,以及…...
实现 INFINI Console 与 GitHub 的单点登录集成:一站式身份验证解决方案
本文将为您详细解析如何通过 GitHub OAuth 2.0 协议,为 INFINI Console 实现高效、安全的单点登录(Single Sign-On, SSO)集成。通过此方案,用户可直接使用 GitHub 账户无缝登录 INFINI Console,简化身份验证流程&#…...
Linux系统安装MySQL5.7(其他版本类似)避坑指南
1.远程连接 在Linux系统安装好MySQL5.7数据库,不要以为就大功告成了后面还有大坑等着你踩了。宏哥这里介绍一下远程连接遇到的坑以及如何处理。由于征文要求安装环境教学除外宏哥这里就不介绍在Linux系统安装mysql数据库,有需要的可以自己百度一下。但是…...
新数据结构(12)——代理
什么是代理 在进行操作时有时不希望用户直接接触到目标,这时需要使用代理让用户间接接触到目标 给目标对象提供一个代理对象,并且由代理对象控制着对目标对象的引用 图解: 代理的目的 控制访问:通过代理对象的方式间接的访问目…...
VLM(视觉语言模型)与DeepSeek R1(奖励机制)如何结合
VLM(视觉语言模型)与DeepSeek R1(奖励机制)如何结合 flyfish VLM的传统训练依赖于监督学习(直接拟合问答对),而规则奖励函数通常用于强化学习(通过试错和奖励反馈优化策略…...
问题:Flask应用中的用户会话(Session)管理失效
我来分享一个常见的PythonWeb开发问题: 问题:Flask应用中的用户会话(Session)管理失效 这是一个在Flask开发中经常遇到的问题。当用户登录后,有时会话会意外失效,导致用户需要重复登录。 解决方案: 1. 首先&#x…...
Qt/C++面试【速通笔记一】
Qt 信号与槽机制 什么是信号(Signal)和槽(Slot)? 在Qt中,信号(Signal)和槽(Slot)是实现对象之间通信的一种机制。信号是对象在某些事件发生时发出的通知&…...
RoCBert:具有多模态对比预训练的健壮中文BERT
摘要 大规模预训练语言模型在自然语言处理(NLP)任务上取得了最新的最优结果(SOTA)。然而,这些模型容易受到对抗攻击的影响,尤其是对于表意文字语言(如中文)。 在本研究中࿰…...
DeepSeek入门到大师 清华大学[1-5版]全集
1、文件概览 1、清华大学《DeepSeek:从入门到精通》 2、清华大学《Deepseek如何赋能职场应用?》 3、清华大学《普通人如何抓住DeepSeek红利》 4、清华大学《DeepSeekDeepResearch让科研像聊天一样简单》 5、清华大学《DeepSeek与AI幻觉》 6、天津大学《深度解读Deepseek:原理…...
Debezium:实时数据捕获与同步的利器
一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...
【蓝桥杯】第十五届省赛大学真题组真题解析
【蓝桥杯】第十五届省赛大学真题组真题解析 一、智能停车系统 1、知识点 (1)flex-wrap 控制子元素的换行方式 属性值有: no-wrap不换行wrap伸缩容器不够则自动往下换行wrap-reverse伸缩容器不够则自动往上换行 (2࿰…...
AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
清华大学出品《DeepSeek:从入门到精通》分享 在忙碌的职场中,制作一份高质量的PPT往往需要投入大量时间和精力,尤其是在临近截止日期时。今天,我们将探索如何借助 AI 工具 —— DeepSeek 和 Kimi —— 让 PPT 制作变得既快捷又高…...
【MySQL篇】持久化和非持久化统计信息的深度剖析(含analyze命令和mysqlcheck工具两种收集方式)
💫《博主介绍》:✨又是一天没白过,我是奈斯,从事IT领域✨ 💫《擅长领域》:✌️擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(…...
C++ 手撕定时器
C 手撕定时器 思路与知识调用场景类声明 参考 思路与知识 1. 为了支持相同时间戳下多个任务,需要考虑到支持重复key的std::mutimap, 以及成员函数equal_range 2. 工具函数Timer::GetTick 返回一个uint64_t毫秒时间戳作为multimap的key,需要会使用chrono…...
邮件安全之发件人伪造
电子邮件工作原理 电子邮件传输过程中主要涉及到SMTP、IMAP、POP3三种协议,具体功能如下: SMTP:全称Simple Mail Transfer Protocol,即简单邮件传输协议,主要用于发送邮件,使用端口号25。 IMAP:全称Internet Mail Acce…...
前端八股——JS+ES6
前端八股:JSES6 说明:个人总结,用于个人复习回顾,将持续改正创作,已在语雀公开,欢迎评论改正。...
Qt QTreeWidget 总结
Qt QTreeWidget 总结 1. 概述 QTreeWidget 是 Qt 中用于显示树形结构的控件,继承自 QTreeView,但提供了更简单的接口。适合展示层级数据(如文件目录、组织结构)。每个节点是 QTreeWidgetItem 对象,支持文本、图标、复…...
Python常见面试题的详解16
1. 如何强行关闭客户端和服务器之间的连接? 在网络编程中,有时需要强行中断客户端和服务器之间的连接。对于基于 TCP 协议的连接,由于其面向连接的特性,需要采取特定的步骤来确保连接被正确关闭;而 UDP 是无连接协议&a…...
前端设计模式面试题及参考答案
目录 如何用闭包实现单例模式?列举两种实现方式 工厂模式与构造函数创建对象的核心区别是什么? 抽象工厂模式如何解决多平台 UI 组件兼容问题? 原型模式在前端框架中如何优化对象创建性能? 建造者模式如何实现复杂表单配置的链式调用? 单例模式在全局状态管理中的典型…...
Python Django系列—入门实例(二)
数据库配置 现在,打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下, DATABASES 配置使用 SQLite。如果你是数据库新手,或者只是想尝试 Django,这是最简单的选择。SQLite 包含在 Python 中…...
STM32-智能台灯项目
一、项目需求 1. 红外传感器检测是否有人,有人的话实时检测距离,过近则报警;同时计时,超过固定时间则报警; 2. 按键 1 切换工作模式:智能模式、按键模式、远程模式; 3. 智能模式下,根…...
HTML之JavaScript DOM操作元素(2)
HTML之JavaScript DOM操作元素(2) 4.增删元素var element document.createElement("元素名") 创建新元素父元素.appendChild(子元素) 在父元素中追加子元素父元素.insertBefore(新元素,参照元素) 在特定元素之前新增元…...
智能优化算法:莲花算法(Lotus flower algorithm,LFA)介绍,提供MATLAB代码
一、 莲花算法 1.1 算法原理 莲花算法(Lotus flower algorithm,LFA)是一种受自然启发的优化算法,其灵感来源于莲花的自清洁特性和授粉过程。莲花的自清洁特性,即所谓的“莲花效应”,是由其叶片表面的微纳…...
【复习】计算机网络
网络模型 OSI 应用层:给应用程序提供统一的接口表示层:把数据转换成兼容另一个系统能识别的格式会话层:负责建立、管理、终止表示层实体之间的通信会话传输层:负责端到端的数据传输网络层:负责数据的路由、转发、分片…...
【R语言】读取CSV数据时,显示[1] PK...<0 行> (或0-长度的row.names)
一、问题 当我使用以下代码读取CSV数据后,发现使用head(data)显示[1] PK...<0 行> (或0-长度的row.names),如下截图所示。 # 尝试读取文件 data <- read.csv("C:\\Users\\11300\\Desktop\\test.csv", header TRUE) # 检查数据 hea…...
CentOS环境变量配置+解析
环境变量的作用就是让系统快速通过你的命令找到你的可执行程序,windows系统里也同理,也就是你每次输入个命令,系统就会找环境变量里到底有没有叫这个命令进程的 一、环境变量配置 1.编辑配置文件 vim /etc/profile export PATH$PATH:$JAVA…...
最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程
ExoPlayer 是一个开源的 Android 媒体播放库,由 Google 开发和维护,用于替代 Android 系统自带的 MediaPlayer。它提供了更强大的功能、更好的性能和更高的灵活性,适用于各种复杂的媒体播放场景。所以被广泛用于各种播放器场景。 最近项目中…...
【蓝桥杯集训·每日一题2025】 AcWing 6134. 哞叫时间II python
6134. 哞叫时间II Week 1 2月20日 农夫约翰正在试图向埃尔茜描述他最喜欢的 USACO 竞赛,但她很难理解为什么他这么喜欢它。 他说「竞赛中我最喜欢的部分是贝茜说『现在是哞哞时间』并在整个竞赛中一直哞哞叫」。 埃尔茜仍然不理解,所以农夫约翰将竞赛…...
HTML/CSS中子代选择器
1.作用:选中指定元素中,符合要求的子元素. 子代选择器又称:子元素选择器,子选择器. 2.语法:选择器1>选择器2>选择器3>......选择器n 3.实例 <style>/* div中子代选择器 */div>a{color: red;}</style><div><a href"#">张三</…...
计算机毕业设计SpringBoot+Vue.jst网上购物商城系统(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
EasyRTC:全平台支持与自研算法驱动的智能音视频通讯解决方案
在智能硬件的浪潮中,设备之间的互联互通已成为提升用户体验的核心需求。无论是智能家居、智能办公,还是工业物联网,高效的音视频通讯和交互能力是实现智能化的关键。然而,传统音视频解决方案往往面临平台兼容性差、交互体验不佳以…...
C#: 日志函数
背景: 1.常见的官方日志模块项目过于复杂,且配置过于繁琐,针对这种现象,实现在大型项目中快速定位错误问题; 实现思路: 1.设置当前日志文件路径(获取到当前文件应用程序路径 \ErrorLog) 2.判…...
PyTorch 是如何进行机器学习的
1. 机器学习的核心流程 机器学习的核心是通过数据训练模型,让模型学会从输入数据中提取规律,并对新数据做出预测。整个过程可以分为以下几个步骤: 准备数据:收集并整理数据,分为输入(特征)和输…...
Java中的Stream API:从入门到实战
引言 在现代Java开发中,Stream API 是处理集合数据的强大工具。它不仅让代码更加简洁易读,还能通过并行处理提升性能。本文将带你从基础概念入手,逐步深入Stream API的使用,并通过实战案例展示其强大功能。 1. 什么是Stream API…...
【蓝桥杯单片机】客观题
一、第十三届省赛(一) 二、第十三届省赛(二)...
Spring Boot 中使用 @Transactional 注解配置事务管理
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污…...
嵌入式八股文(五)硬件电路篇
一、名词概念 1. 整流和逆变 (1)整流:整流是将交流电(AC)转变为直流电(DC)。常见的整流电路包括单向整流(二极管)、桥式整流等。 半波整流:只使用交流电的正…...
《论多源数据集成及应用》审题技巧 - 系统架构设计师
论多源数据集成及应用写作框架 一、考点概述 本论题“论多源数据集成及应用”主要考察的是计算机软件测试工程师在数据管理和集成方面的专业知识与实践能力。论题聚焦于信息爆炸时代企业、组织和个人所面临的数据挑战,特别是如何有效地收集、整理和清洗来自不同渠…...
怎么在Github上readme文件里面怎么插入图片?
环境: Github 问题描述: 怎么在Github上readme文件里面怎么插入图片? https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案: 1.相对路径引用 上传图片到仓库 将图片文件(如 .png/.jpgÿ…...