[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)
一、前言
📌 为什么日志在项目中如此重要?
在开发和维护一个后端系统时,日志就像程序运行时的“黑匣子”,帮我们记录系统的各种行为和异常。一份良好的日志,不仅能帮助我们快速定位问题,还能在以下场景中发挥关键作用:
-
调试问题:程序出错时,可以通过日志快速追踪到发生错误的地方和上下文。
-
系统监控:通过分析日志,可以了解系统的运行状态,比如某个接口是否经常超时。
-
审计追踪:记录用户行为、接口访问等日志,有助于回溯历史操作。
-
性能优化:记录接口耗时,有助于发现性能瓶颈。
-
安全排查:某些攻击行为可以通过日志分析提前发现,比如异常的访问频率。
🔍 简单来说,日志是系统运行时的“眼睛”和“嘴巴”,没有它,我们就像在黑暗中摸索,问题一多就会手足无措。
🧰 Spring Boot 对日志的支持有哪些特点?
Spring Boot 对日志系统做了很多“自动化”处理,对初学者非常友好:
-
默认集成 Logback + SLF4J:
-
Spring Boot 自动帮你配置好日志系统,不用你从头开始搭建。
-
使用的是 SLF4J 作为日志门面,默认底层实现是 Logback,开箱即用。
-
-
自动控制台输出日志:
-
启动项目时就能看到 INFO、WARN、ERROR 等日志输出。
-
不需要任何配置就可以看到清晰的启动信息、异常堆栈等。
-
-
支持多种日志格式和输出方式:
-
控制台输出、文件输出、按天或文件大小自动切割归档。
-
支持通过
application.properties
或logback-spring.xml
灵活配置。
-
-
支持不同环境配置日志级别:
-
可以根据环境(开发、测试、生产)设置不同的日志策略。
-
避免开发环境日志过少、生产环境日志过多等问题。
-
-
与 Spring 框架深度集成:
-
Spring Boot 各个组件、第三方依赖库都统一使用日志门面,方便统一管理和配置。
-
🎯 总结一句话:Spring Boot 的日志系统 默认好用,扩展灵活,既适合入门,也能应对复杂需求。
二、日志基础概念
🧠 什么是日志系统?
日志系统是用于记录程序在运行过程中的各种事件和信息的一套机制。
通过日志,我们可以了解程序在什么时间、什么地方、发生了什么,以及是否发生了错误。
简单理解,日志就像你写日记,程序每天都在告诉你:“我做了什么”,“我哪里出错了”。
日志通常包括以下内容:
-
时间戳(事件发生的时间)
-
日志级别(信息的严重程度,如 INFO、ERROR)
-
类名或线程名(哪个部分打印的)
-
具体的消息(发生了什么)
例如,一条典型的日志可能长这样:
2025-04-11 10:30:15.123 INFO 12345 --- [ main] com.example.demo.DemoApp : 应用启动成功
🔧 常见的日志框架介绍
Java 世界中,有很多日志框架。我们常用的主要有四种角色:
1. Java Util Logging(JUL)
-
Java 自带的日志框架,包名是
java.util.logging
。 -
优点:内置,无需引入依赖。
-
缺点:功能简单,不够灵活,扩展性差,格式不够直观。
-
用得越来越少,大型项目基本不用它。
2. Log4j / Log4j2
-
Log4j 是 Apache 提供的经典日志框架,功能强大,配置灵活。
-
Log4j2 是 Log4j 的升级版,性能更好,支持异步日志、高并发。
-
注意:Log4j 1.x 存在安全漏洞(Log4Shell),已被淘汰,推荐使用 Log4j2。
-
使用 Log4j2 时需要排除 Spring Boot 默认的 Logback,再手动配置依赖。
3. SLF4J(Simple Logging Facade for Java)【日志门面】
-
SLF4J 不是日志框架,而是一个 日志“门面”,像一个“统一的接口”。
-
作用:屏蔽底层实现的差异,让你可以自由切换 Logback、Log4j 等实现。
-
使用方式:
private static final Logger logger = LoggerFactory.getLogger(MyClass.class); logger.info("Hello, log!");
-
好处:项目中只依赖 SLF4J,不绑定具体实现,解耦 + 灵活。
4. Logback(默认实现)
-
Logback 是由 Log4j 的作者开发的新一代日志框架,性能更优。
-
Spring Boot 默认使用 Logback 作为日志实现。
-
支持控制台、文件、多种格式的日志输出。
-
和 Spring Boot 配合得非常好,扩展性强。
🎯 总结
角色 | 名称 | 说明 |
---|---|---|
日志接口 | SLF4J | 日志门面,统一 API |
日志实现 | Logback | Spring Boot 默认,推荐 |
其他实现 | Log4j2 | 高性能替代品,需手动替换 |
系统自带 | JUL | 不推荐,过于简单 |
三、Spring Boot 默认日志配置
Spring Boot 之所以深受欢迎,其中一个原因就是它对日志的默认配置开箱即用,开发者可以无需任何额外设置就能看到格式良好的日志输出。下面我们来详细看看它默认是怎么做的。
✅ Spring Boot 默认使用的日志框架(Logback + SLF4J)
Spring Boot 默认集成了两个日志相关的库:
-
SLF4J:日志门面,提供统一的日志接口。
-
Logback:默认的底层实现,用于实际输出日志。
这意味着你在写代码时使用的是 SLF4J 提供的统一 API,比如:
private static final Logger logger = LoggerFactory.getLogger(MyClass.class);logger.info("系统启动成功!");
而最终控制台看到的输出,其实是由 Logback 处理并输出的。
💡 不需要手动添加依赖,这些默认都由 Spring Boot Starter 自动帮你配置好了。
💻 控制台输出的日志格式说明
Spring Boot 启动时你会看到类似这样的日志输出:
2025-04-11 10:25:31.456 INFO 12345 --- [ main] com.example.demo.DemoApplication : Started DemoApplication in 3.456 seconds
这行日志可以拆解成几个部分:
部分 | 含义 |
---|---|
2025-04-11 10:25:31.456 | 时间戳 |
INFO | 日志级别 |
12345 | 线程 ID(或者进程 ID) |
--- [ main] | 当前线程名称 |
com.example.demo.DemoApplication | 打印日志的类 |
: Started DemoApplication... | 实际输出的信息 |
这些格式由 Logback 的默认配置定义,你可以通过自定义 logback-spring.xml
来修改它。
🧱 默认日志级别说明(从低到高)
日志级别用于区分日志的重要程度,Spring Boot(Logback)默认支持以下几个级别:
级别 | 说明 | 使用场景 |
---|---|---|
TRACE | 最细的日志级别 | 一般用于调试时跟踪方法调用过程 |
DEBUG | 调试信息 | 开发过程中用于查看变量值、流程走向等 |
INFO | 普通信息 | 系统正常运行的重要提示,如启动成功 |
WARN | 警告信息 | 表示可能存在问题,但不影响正常运行 |
ERROR | 错误信息 | 程序出现异常或功能出错 |
🔽 默认输出级别是 INFO
及以上,也就是说你写的 debug()
、trace()
日志默认是看不到的,除非你手动设置级别为 DEBUG。
示例:设置为 DEBUG 日志级别
你可以在 application.properties
中这样配置,让项目打印更多调试信息:
logging.level.root=DEBUG
或者针对某个包:
logging.level.com.example=DEBUG
这样可以避免日志太多,控制只打印你关注的部分代码的调试信息。
四、如何自定义日志配置
虽然 Spring Boot 默认日志配置就够用,但实际开发中我们往往希望控制日志级别、格式、输出位置,甚至输出到文件或远程系统。下面就来手把手教你怎么自定义这些设置。
1️⃣ 修改日志级别
Spring Boot 支持通过配置文件修改日志的输出级别,既可以全局设置,也可以针对某个包或类设置。
✅ 在 application.properties
中配置:
# 设置全局日志级别为 DEBUG
logging.level.root=DEBUG# 单独为指定包设置为 DEBUG,其它保持 INFO
logging.level.com.example.myapp=DEBUG
✅ 在 application.yml
中配置:
logging:level:root: INFOcom.example.myapp: DEBUG
💡 小贴士:开发环境建议 DEBUG,生产环境建议 INFO 或 WARN,避免日志太多影响性能。
2️⃣ 自定义日志格式
如果你不喜欢默认的控制台格式,或者想输出更多内容(如线程名、类名、方法名等),可以创建一个自定义的配置文件。
📝 创建 logback-spring.xml
文件(放在 resources/
目录下)
<?xml version="1.0" encoding="UTF-8"?>
<configuration><!-- 控制台输出 --><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><!-- pattern 为日志格式 --><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 根日志配置 --><root level="INFO"><appender-ref ref="Console" /></root></configuration>
常见配置项说明:
配置项 | 说明 |
---|---|
pattern | 日志输出格式(时间、线程、级别、类名、消息) |
appender | 输出目标,比如 Console、File 等 |
logger | 针对某个类或包配置的日志 |
root | 根日志,默认应用于所有包 |
3️⃣ 输出日志到文件
默认 Spring Boot 日志只输出到控制台,如果你想将日志保存到本地文件中,可以用 RollingFileAppender 实现。
🔁 输出到文件并支持按大小或时间归档:
<appender name="FileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>logs/app.log</file><!-- 日志滚动策略:按天切割 --><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><!-- 文件名格式:logs/app-2025-04-11.log --><fileNamePattern>logs/app-%d{yyyy-MM-dd}.log</fileNamePattern><!-- 最大保留 30 天 --><maxHistory>30</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder>
</appender><!-- 根日志同时输出到控制台和文件 -->
<root level="INFO"><appender-ref ref="Console" /><appender-ref ref="FileAppender" />
</root>
🔐 日志归档策略建议
策略类型 | 说明 |
---|---|
按时间归档 | TimeBasedRollingPolicy ,常用于按天/月切割 |
按大小归档 | SizeBasedTriggeringPolicy ,适合高并发项目 |
限制日志数量 | maxHistory 控制最多保留几天的日志 |
限制文件大小 | totalSizeCap 可限制整个日志目录大小 |
🔚 小结
-
使用
application.properties
配置简单快捷,适合设置日志级别; -
用
logback-spring.xml
能够精细控制输出格式和目标,适合复杂需求; -
文件输出和归档非常适合生产环境,有助于长期追踪和问题排查。
下面是为你准备的两个日志配置模板,分别适用于:
-
🛠 开发环境(dev):日志详细、方便调试;
-
🚀 生产环境(prod):日志适度、重点关注问题和性能。
这两个配置文件可以分别命名为:
logback-dev.xml
logback-prod.xml
并通过 Spring Boot 的多环境配置机制切换,比如:
# application-dev.properties
spring.profiles.active=dev# application-prod.properties
spring.profiles.active=prod
✅ 开发环境日志配置(logback-dev.xml)
<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="LOG_PATH" value="logs/dev"/><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/dev.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/dev-%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>7</maxHistory></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern></encoder></appender><!-- 开发环境 DEBUG 级别 --><root level="DEBUG"><appender-ref ref="Console"/><appender-ref ref="File"/></root></configuration>
✅ 生产环境日志配置(logback-prod.xml)
<?xml version="1.0" encoding="UTF-8"?>
<configuration><property name="LOG_PATH" value="logs/prod"/><appender name="Console" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern></encoder></appender><appender name="File" class="ch.qos.logback.core.rolling.RollingFileAppender"><file>${LOG_PATH}/prod.log</file><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><fileNamePattern>${LOG_PATH}/prod-%d{yyyy-MM-dd}.log</fileNamePattern><maxHistory>30</maxHistory><totalSizeCap>1GB</totalSizeCap></rollingPolicy><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} %-5level [%thread] %logger{36} - %msg%n</pattern></encoder></appender><!-- 生产环境 INFO 起步,避免太多无用日志 --><root level="INFO"><appender-ref ref="Console"/><appender-ref ref="File"/></root></configuration>
💡 使用方法:
将这两个 XML 文件放到 resources/
目录下,并命名为:
-
logback-spring.xml
(用于默认环境) -
或结合 profile 使用:
logback-dev.xml
,logback-prod.xml
你也可以在配置文件中显式指定要使用的日志文件:
logging.config=classpath:logback-dev.xml
五、实用技巧与最佳实践
写日志不是随便 System.out.println()
,而是一种规范的技能。好的日志能帮你救命,坏的日志只会制造更多混乱。这一节就来教你怎么写“聪明”的日志。
1️⃣ 使用占位符语法(推荐写法)
🚫 错误示例(不要这样):
logger.info("User id: " + userId);
✅ 正确示例(推荐):
logger.info("User id: {}", userId);
为什么?
-
性能更好:如果当前日志级别低于 info,
userId
的toString()
都不会被执行,减少性能浪费; -
更安全:日志系统会自动格式化参数,避免乱码和拼接错误;
-
更整洁:日志模板更清晰、统一。
2️⃣ 不要在生产环境打开 DEBUG 或 TRACE
DEBUG 和 TRACE 会输出大量日志,在生产环境可能导致:
-
日志文件暴涨,占满磁盘
-
日志查阅困难,关键信息被埋没
-
性能下降(尤其是在高并发系统中)
✅ 推荐做法:
-
开发阶段使用
DEBUG
; -
测试阶段使用
INFO
; -
上线部署时设置为
INFO
或WARN
,只记录关键事件和错误。
# application-prod.properties
logging.level.root=INFO
3️⃣ 日志中避免打印敏感信息
日志一旦暴露给外部人员,可能泄露用户隐私和系统安全信息。
🚫 千万不要这样做:
logger.info("登录成功,密码为:{}", password);
logger.debug("Token: {}", accessToken);
✅ 推荐做法:
-
脱敏或打码:只保留前后几位
-
提示性信息:避免原文出现
logger.info("用户 {} 登录成功", username);
logger.warn("检测到异常登录行为,token 已隐藏");
4️⃣ 区分 dev/test/prod 环境日志配置
开发环境和生产环境的日志需求完全不同,建议使用 Spring Boot 的多 profile 特性,为每个环境配置专属日志策略:
🛠 开发环境(dev):
-
日志级别:DEBUG
-
输出位置:控制台 + 日志文件
-
格式详细,便于排查 bug
✅ 生产环境(prod):
-
日志级别:INFO 或 WARN
-
输出位置:日志文件
-
日志归档:按天/大小切割,保留30天
-
禁止输出敏感数据
配置方式:
# application.properties
spring.profiles.active=prod
结合 logback-spring.xml
使用 <springProfile>
标签:
<springProfile name="dev"><!-- 开发环境日志配置 -->
</springProfile><springProfile name="prod"><!-- 生产环境日志配置 -->
</springProfile>
🆚 错误日志 vs 优雅日志(对比示例)
这一块可以放在博客中作为视觉亮点,帮助读者立刻理解“什么叫写好日志”。
📌 示例对比表:
❌ 错误写法 | ✅ 优雅写法 | 原因说明 |
---|---|---|
logger.info("User login: " + userId); | logger.info("User login: {}", userId); | 使用占位符,避免不必要的字符串拼接 |
logger.debug("Token=" + token); | logger.debug("Token received, length: {}", token.length()); | 不打印敏感信息原文,输出摘要信息即可 |
logger.error("Exception occurred: " + e.getMessage()); | logger.error("Exception during processing", e); | 推荐直接传 Throwable 对象,堆栈信息更完整 |
System.out.println("User created"); | logger.info("User {} created", username); | 不建议使用 System.out ,使用日志框架更规范 |
logger.debug("Step 1"); logger.debug("Step 2"); | logger.debug("Processing user {}, step {}", userId, step); | 多条日志合并为有结构的信息,方便追踪 |
logger.trace("enter function"); | logger.trace("Enter: {}()", methodName); | 日志上下文更清楚,方便排查逻辑流程 |
🔚 小结
技巧 | 原因 |
---|---|
使用占位符 | 性能更好,结构更清晰 |
避免拼接日志 | 不必要的计算,浪费资源 |
不打印敏感信息 | 保证安全合规 |
不开 DEBUG 在生产 | 减少无效日志,保护系统性能 |
多环境配置 | 按需记录,控制信息量 |
六、整合其他日志框架(如使用 Log4j2)
🛠 替换默认 Logback 为 Log4j2
Spring Boot 默认使用 Logback,但如果你想使用 Log4j2,需要做一些配置和依赖调整。
1️⃣ 添加 Log4j2 相关依赖
首先,去掉默认的 Logback 依赖,然后引入 Log4j2 相关的依赖。
pom.xml(如果是 Maven 项目):
<dependencies><!-- 排除 Spring Boot 默认的 Logback --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId><scope>provided</scope></dependency><!-- 添加 Log4j2 的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>
build.gradle(如果是 Gradle 项目):
dependencies {// 排除默认的 Logbackimplementation('org.springframework.boot:spring-boot-starter-logging') {exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'}// 添加 Log4j2 依赖implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}
2️⃣ 配置 Log4j2 文件
Spring Boot 默认会自动识别 log4j2.xml
配置文件,所以你需要在 resources/
目录下创建 log4j2.xml
文件,进行自定义配置。
log4j2.xml(示例配置):
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><!-- 定义日志输出的格式 --><Appenders><!-- 控制台输出 --><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n" /></Console><!-- 文件输出 --><RollingFile name="File" fileName="logs/app.log" filePattern="logs/app-%d{yyyy-MM-dd}.log"><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n" /><Policies><TimeBasedTriggeringPolicy interval="1" modulate="true"/></Policies></RollingFile></Appenders><!-- 配置日志级别 --><Loggers><!-- 根日志级别 --><Root level="INFO"><AppenderRef ref="Console" /><AppenderRef ref="File" /></Root></Loggers></Configuration>
这个配置文件设置了两种输出方式:
-
控制台输出(
Console
) -
文件输出(
RollingFile
),日志文件按日期滚动保存
3️⃣ 注意事项:依赖冲突与排除默认依赖
-
依赖冲突:Spring Boot 默认会包含 Logback 相关的依赖(如
spring-boot-starter-logging
),如果你添加了spring-boot-starter-log4j2
,则需要排除默认的 Logback 依赖,否则会引发依赖冲突,导致应用启动失败。 -
排除默认依赖:正如前面所示,Maven 或 Gradle 中需要排除
spring-boot-starter-logging
,这样 Spring Boot 就不会再自动配置 Logback。 -
版本兼容性:确保 Log4j2 的版本与 Spring Boot 版本兼容。Spring Boot 默认的 Log4j2 版本是 2.x,而 Log4j 1.x 版本与 Spring Boot 不兼容。
4️⃣ 日志级别和输出格式
你可以根据需要灵活调整日志级别和输出格式,比如将日志级别设置为 DEBUG
或 WARN
,控制不同包和类的日志输出:
<Loggers><Logger name="org.springframework.web" level="DEBUG" additivity="false"><AppenderRef ref="Console"/></Logger>
</Loggers>
这个配置将 org.springframework.web
包的日志级别设置为 DEBUG
,并输出到控制台。
🔚 小结
-
替换默认 Logback 为 Log4j2 的步骤:
-
排除默认的 Logback 依赖;
-
引入
spring-boot-starter-log4j2
; -
配置
log4j2.xml
; -
注意依赖冲突,排除默认日志。
-
-
Log4j2 的优势:性能高、配置灵活、功能丰富(如异步日志、日志归档等)。
七、查看日志的常用工具
1️⃣ 使用 tail
命令查看日志文件
在 Linux 或 macOS 系统中,tail
是查看日志文件的非常方便的工具,尤其适用于实时监控日志输出。你可以通过命令行直接查看日志文件内容,常用于生产环境中排查问题。
基本用法
-
查看日志文件的最后 10 行:
tail -n 10 logs/app.log
-
实时跟踪日志(类似于“实时输出”):
tail -f logs/app.log
-
查看文件内容并输出新增内容(
tail -f
可以看到日志实时更新):
tail -f logs/app.log | grep "ERROR"
-
查看日志文件最后 N 行并同时输出新增内容:
tail -n 100 -f logs/app.log
2️⃣ 使用 Spring Boot Admin 查看日志
Spring Boot Admin 是一个用于监控 Spring Boot 应用的开源项目,它允许你通过一个图形化界面查看和管理多个 Spring Boot 应用的日志。
集成 Spring Boot Admin
-
添加 Spring Boot Admin 依赖
在你的 Spring Boot 项目中,添加 Spring Boot Admin 的依赖。
pom.xml(Maven):
<dependencies><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-server</artifactId><version>2.6.0</version> <!-- 选择与 Spring Boot 兼容的版本 --></dependency>
</dependencies>
-
启用 Spring Boot Admin 服务器
在主类(@SpringBootApplication
的类)上添加 @EnableAdminServer
注解。
import de.codecentric.boot.admin.server.config.EnableAdminServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableAdminServer
public class AdminServerApplication {public static void main(String[] args) {SpringApplication.run(AdminServerApplication.class, args);}
}
-
配置应用连接到 Spring Boot Admin 服务器
在客户端应用(即你要监控的 Spring Boot 应用)中,添加 Spring Boot Admin 的客户端依赖:
pom.xml(Maven):
<dependencies><dependency><groupId>de.codecentric</groupId><artifactId>spring-boot-admin-starter-client</artifactId><version>2.6.0</version> <!-- 选择与 Spring Boot 兼容的版本 --></dependency>
</dependencies>
-
配置 Spring Boot Admin 客户端
在 application.properties
或 application.yml
中添加以下配置,连接到 Spring Boot Admin 服务器:
spring.boot.admin.client.url=http://localhost:8080
-
访问 Spring Boot Admin 界面
启动 Spring Boot Admin 服务器后,访问界面 URL(例如:http://localhost:8080
)即可查看所有注册的 Spring Boot 应用的信息,包括日志、健康检查、性能指标等。
3️⃣ 使用 ELK 堆栈查看日志
ELK(Elasticsearch, Logstash, Kibana)是一个强大的日志管理和分析工具,适用于大规模分布式应用。通过 ELK 堆栈,你可以集中收集、存储和分析日志数据,并通过 Kibana 提供的图形界面进行实时查询和可视化分析。
ELK 堆栈概述
-
Elasticsearch:搜索和分析引擎,用于存储日志数据。
-
Logstash:日志收集和处理工具,负责将日志数据从各种来源(如文件、数据库、消息队列等)传输到 Elasticsearch。
-
Kibana:前端可视化工具,提供图形化界面用于查询和展示 Elasticsearch 中的日志数据。
集成 ELK 堆栈
-
安装和启动 ELK
你可以通过 Docker 快速启动 ELK 堆栈(Elasticsearch、Logstash、Kibana):
docker-compose up -d
-
配置 Logstash
在 Logstash 中配置输入(Input)、过滤(Filter)和输出(Output),例如:
input {file {path => "/path/to/your/logs/*.log"start_position => "beginning"}
}filter {# 可以添加一些过滤规则,如解析 JSON 或解析日志格式
}output {elasticsearch {hosts => ["http://localhost:9200"]index => "springboot-logs-%{+YYYY.MM.dd}"}
}
-
访问 Kibana
Kibana 提供了一个 Web UI,访问 http://localhost:5601
,可以通过 Kibana 查询、可视化日志,并设置仪表盘来监控日志。
ELK 优势
-
强大的搜索与分析功能:支持复杂的查询与实时分析,适合大规模日志数据的分析。
-
实时可视化:Kibana 提供丰富的图表、表格和仪表盘,可快速发现日志中的趋势、异常和潜在问题。
-
日志聚合:支持多种数据源的聚合、过滤和分析,帮助开发和运维人员更高效地处理日志数据。
🔚 小结
工具 | 描述 | 优势 |
---|---|---|
tail 命令 | 实时查看日志文件 | 简单、快速、适合命令行用户 |
Spring Boot Admin | 图形化监控 Spring Boot 应用的日志 | 易于配置、集中管理、支持健康检查和性能监控 |
ELK 堆栈 | 高效的日志收集、存储和可视化工具 | 强大的查询和可视化功能,适合大规模日志数据 |
八、实战演示
1️⃣ 创建一个简单的 Spring Boot 项目
如果你还没有 Spring Boot 项目,可以通过 Spring Initializr 快速创建一个。
-
访问 Spring Initializr,选择如下配置:
-
Project: Maven Project
-
Language: Java
-
Spring Boot Version: 2.x(选择当前最新版本)
-
Project Metadata:
-
Group:
com.example
-
Artifact:
logdemo
-
Name:
logdemo
-
Packaging: Jar
-
Java: 11 或以上
-
-
Dependencies: Spring Web
-
点击 Generate 下载生成的 ZIP 文件,然后解压并导入到 IDE 中。
2️⃣ 配置日志输出到控制台和文件
在 Spring Boot 中,默认的日志框架是 Logback。你可以通过配置文件(如 application.properties
或 application.yml
)来自定义日志的输出方式和格式。这里我们将展示如何将日志同时输出到控制台和文件。
使用 application.properties
配置
在 src/main/resources/application.properties
文件中添加以下配置:
# 配置日志级别为 INFO
logging.level.root=INFO# 配置日志格式和输出位置
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %-5level - %logger{36} - %msg%n
logging.pattern.file=%d{yyyy-MM-dd HH:mm:ss} - %-5level - %logger{36} - %msg%n# 配置日志文件输出路径和文件名
logging.file.name=logs/app.log
logging.file.max-size=10MB
logging.file.max-history=30
解释配置项:
-
logging.level.root=INFO
:设置日志级别为 INFO,表示 INFO 及更高级别的日志会被输出。 -
logging.pattern.console
:控制台日志输出的格式。 -
logging.pattern.file
:文件日志输出的格式。 -
logging.file.name
:指定日志文件的路径和名称。 -
logging.file.max-size
:设置日志文件的最大大小,达到该大小后会进行日志文件切割。 -
logging.file.max-history
:指定日志文件保留的最大历史文件数。
这样配置后,Spring Boot 会将日志输出到控制台和 logs/app.log
文件中,且文件会按大小进行滚动。
3️⃣ 示例代码:如何正确使用 Logger
在 Spring Boot 项目中,我们通常使用 SLF4J 与 Logback 集成,通过 Logger
接口来记录日志。SLF4J 提供了一个统一的日志接口,能够与多种日志框架(如 Logback、Log4j2)兼容。
在类中使用 Logger
-
创建一个简单的 Controller 来测试日志输出
在 src/main/java/com/example/logdemo
目录下,创建一个 HelloController.java
类,并在其中使用 Logger。
package com.example.logdemo;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {// 获取 Logger 实例private static final Logger logger = LoggerFactory.getLogger(HelloController.class);@GetMapping("/hello")public String sayHello() {// 使用不同级别的日志logger.trace("This is a TRACE level log");logger.debug("This is a DEBUG level log");logger.info("This is an INFO level log");logger.warn("This is a WARN level log");logger.error("This is an ERROR level log");return "Hello, Spring Boot Logging!";}
}
解释:
-
LoggerFactory.getLogger(HelloController.class)
:通过 SLF4J 获取日志记录器实例,HelloController.class
是日志记录的上下文,可以根据类名动态生成日志。 -
不同的日志级别:我们在
sayHello
方法中演示了如何使用不同的日志级别:TRACE
、DEBUG
、INFO
、WARN
和ERROR
。 -
这些日志信息将按照在
application.properties
中配置的格式输出到控制台和日志文件。
4️⃣ 运行应用并查看日志输出
启动 Spring Boot 应用
在 IDE 中运行 LogdemoApplication.java
类(或者通过命令行使用 mvn spring-boot:run
启动应用)。
访问接口并查看日志输出
-
打开浏览器或使用 Postman,访问
http://localhost:8080/hello
。 -
访问时,控制台和
logs/app.log
文件中会输出不同级别的日志。
示例控制台输出:
2025-04-11 15:30:12 - INFO - com.example.logdemo.HelloController - This is an INFO level log
2025-04-11 15:30:12 - WARN - com.example.logdemo.HelloController - This is a WARN level log
2025-04-11 15:30:12 - ERROR - com.example.logdemo.HelloController - This is an ERROR level log
示例日志文件输出:
日志文件 logs/app.log
会记录类似以下的内容:
2025-04-11 15:30:12 - INFO - com.example.logdemo.HelloController - This is an INFO level log
2025-04-11 15:30:12 - WARN - com.example.logdemo.HelloController - This is a WARN level log
2025-04-11 15:30:12 - ERROR - com.example.logdemo.HelloController - This is an ERROR level log
5️⃣ 如何调整日志级别
你可以通过修改 application.properties
文件中的 logging.level
配置来动态改变日志级别。
例如,想要在开发环境中输出 DEBUG
级别的日志,可以在 application.properties
中进行配置:
logging.level.com.example.logdemo.HelloController=DEBUG
这会将 HelloController
类的日志级别调整为 DEBUG
,并输出更多的日志信息。
🔚 小结
-
日志配置:通过
application.properties
可以简单配置日志的输出格式和文件路径,Spring Boot 默认支持 Logback。 -
Logger 使用:通过 SLF4J 提供的
Logger
接口可以方便地记录不同级别的日志。 -
日志文件和控制台输出:日志不仅会输出到控制台,还会根据配置输出到文件中,支持文件滚动和历史保留。
九、总结与推荐阅读
📝 总结:日志的作用与配置重点
在现代的应用程序中,日志是非常重要的一部分。无论是开发阶段的调试,还是生产环境中的问题追踪,日志都能提供重要的线索。日志的好坏直接影响到开发和运维的效率。
日志的作用:
-
问题排查:日志是定位问题、分析应用运行状态的重要工具。通过查看日志,可以快速找到应用出现问题的根源。
-
性能监控:日志可以帮助我们分析应用的性能瓶颈,比如接口响应时间、数据库查询时间等。
-
安全审计:通过日志记录用户操作和系统事件,帮助检测异常操作和潜在的安全问题。
-
应用健康监控:结合 Spring Boot Admin 或 ELK 等工具,我们可以实现应用的实时监控,及时发现应用状态的异常。
日志配置重点:
-
日志级别:合理配置日志级别(TRACE、DEBUG、INFO、WARN、ERROR)非常重要,过多的日志会影响性能,而过少的日志则可能无法及时发现问题。
-
输出目标:Spring Boot 默认的 Logback 支持将日志输出到控制台和文件,文件输出支持日志滚动和归档策略。
-
日志格式:通过配置日志输出的格式,可以让日志更加易于阅读和分析。常见的做法是添加时间戳、日志级别、类名、方法名等信息。
-
日志文件管理:配置日志文件的大小限制和历史日志的保存策略,避免日志文件无限增长。
📚 推荐阅读
为了帮助你更好地理解日志框架的选择和使用,下面是一些推荐的资料:
1️⃣ 官方文档链接:
-
Spring Boot 官方文档:https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.logging
-
Spring Boot 文档中详细介绍了如何配置日志,包含不同配置方式、日志框架的选择及使用。
-
-
Logback 官方文档:Documentation
-
了解 Logback 框架的配置细节、日志输出格式和高级特性。
-
-
SLF4J 官方文档:SLF4J Manual
-
SLF4J 是一个日志门面,支持多种日志框架的兼容,适用于不同的日志实现。
-
-
Log4j 2 官方文档:Manual :: Apache Log4j
-
如果你选择 Log4j2,Apache 提供的官方文档能够帮助你深入了解 Log4j2 的各种特性和配置。
-
2️⃣ SLF4J vs Log4j vs Logback 简析:
-
SLF4J 是一个日志门面,提供统一的日志接口,支持不同的日志实现。它本身不提供日志记录的实现,而是通过其他日志框架(如 Logback 或 Log4j)进行处理。
-
Logback 是一个高性能的日志框架,是 SLF4J 的原生实现,并且作为 Spring Boot 默认的日志框架。它提供了灵活的日志配置、日志滚动、异步日志等高级功能。
-
Log4j(尤其是 Log4j2)是一个流行的日志框架,它提供了比 Logback 更丰富的特性,尤其在性能和灵活性方面有显著优势。Log4j2 支持异步日志、配置的自动更新等。
-
比较分析:
-
性能:Log4j2 相比 Logback 提供了更高的性能,尤其在多线程环境中。
-
功能:Log4j2 提供的异步日志、日志聚合、配置自动更新等功能更加灵活。
-
使用:Logback 相对简单且与 Spring Boot 的集成非常流畅,是默认推荐的日志框架。Log4j2 更适合对日志有特殊要求的大型应用。
-
3️⃣ Spring Boot 实战项目:
-
《Spring Boot 实战》:一本非常经典的书籍,深入讲解了 Spring Boot 的方方面面。书中不仅介绍了如何使用 Spring Boot 进行开发,还涵盖了日志、监控等运维相关的内容。
-
Spring Boot 实战 - 电子书链接
-
-
GitHub 上的 Spring Boot 示例项目:你可以参考一些开源项目,了解日志在实际项目中的使用。比如:
-
Spring Boot 示例项目
-
Spring Boot Admin 官方示例
-
🔚 结语
日志是软件开发中的重要组成部分,它不仅是问题排查的关键工具,也是应用性能和健康监控的重要手段。在本文中,我们详细探讨了 Spring Boot 中日志的配置和最佳实践,介绍了常见的日志框架(如 SLF4J、Logback、Log4j2)及其使用方法。
通过理解日志的作用和如何高效地管理日志输出,你可以更好地监控应用的运行状态,及时发现并解决潜在问题。同时,合理配置日志的级别、格式和输出方式,能够提高开发效率,减少因日志管理不当而带来的困扰。
希望你能通过本篇文章对 Spring Boot 中的日志配置有一个清晰的认识,并能够在自己的项目中灵活运用。如果你在日志的使用过程中遇到任何挑战,或者希望深入学习更多内容,欢迎参考推荐的资料和进一步的探索。
日志配置是开发和运维工作的一项基础技能,掌握它,将让你的开发和运维工作更加高效、稳定。
相关文章:
[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)
一、前言 📌 为什么日志在项目中如此重要? 在开发和维护一个后端系统时,日志就像程序运行时的“黑匣子”,帮我们记录系统的各种行为和异常。一份良好的日志,不仅能帮助我们快速定位问题,还能在以下场景中…...
【模拟电路】隧道二极管
与标准二极管相比,隧道二极管通过使用具有令人难以置信的大掺杂水平的半导体物质来工作,导致p-n结之间的耗尽层变得比最快的硅二极管窄约1000倍。 一旦隧道二极管正向偏置,整个p-n结开始发生称为电子流“隧穿”的过程。 在测试隧道二极管的…...
qwen-vl 实现OCR的测试
OCR 技术是数字化时代必不可少的实用工具。以前都依赖专业的公司的专业软件才能完成。成本很高。也正因为如此,我国纸质资料的数字化并不普及。基于大模型的ORC 也许会改变这样的现状。 文本识别,也称为光学字符识别 (OCR),可以将印刷文本或…...
3.0/Q2,Charls最新文章解读
文章题目:Exploring the association between socioeconomic inequalities in chronic respiratory disease and all-cause mortality in China: findings from the China Health and Retirement Longitudinal Study DOI:10.3389/fpubh.2024.1472074 中文…...
【大模型系列篇】基于Ollama和GraphRAG v2.0.0快速构建知识图谱
GraphRAG是一种结合了知识图谱和大型语言模型的检索增强生成(RAG)技术。它通过引入图结构化的知识表示和处理方法,显著提升了传统RAG系统的能力,为处理复杂和多样化数据提供了强有力的支持。更多介绍可以跳转《最强检索增强技术Gr…...
Wincc管对象的使用
Wincc管对象的使用 管对象的调用多边形管T形管双T形管管弯头管道大小调整 管对象的调用 打开【图形编辑器】 多边形管 多边形管如下: 一根管子的顶点数是两个,如果修改顶点数,管子就有多少个端点。 修改顶点数为5 此时点击端点然后拖动&#…...
springboot--页面的国际化
今天来实现页面中的国际化 首先,需要创建一个新的spring boot项目,导入前端模板,在我的博客中可以找到,然后将HTML文件放在templates包下,将其他的静态资源放在statics包下,如下图结构 页面的国际化主要在首…...
记 etcd 无法在docker-compose.yml启动后无法映射数据库目录的问题
1、将etcd 单独提取 Dockerfile #镜像 FROM bitnami/etcd:3.5.11 #名称 ENV name"etcd" #重启 ENV restart"always" #运行无权限 ENV ALLOW_NONE_AUTHENTICATION"yes" #端口 EXPOSE 2379 2380 #管理员权限才能创建数据库 USER root # 设置入口点…...
c++关键字new
链接:【C】C中的new关键字用法详解...
数字内容体验的核心价值是什么?
个性化推荐提升满意度 在数字内容体验的构建中,个性化推荐已成为提升用户满意度的核心策略。通过分析用户行为数据、偏好标签及场景特征,系统能够精准匹配内容资源,减少信息过载带来的决策疲劳。例如,基于用户画像的动态推荐算法…...
通过实施最小权限原则(POLP)来保护敏感数据
在处理机密信息时,应始终将确保组织的敏感数据安全放在首位。无论是制定新政策还是参与项目协作,都应采取一切必要预防措施,确保对任何敏感信息进行恰当的访问控制和存储管理。 最小权限原则(POLP)是企业保护客户与员工数据、财务记录、知识…...
VBA即用型代码手册:文档Document
我给VBA下的定义:VBA是个人小型自动化处理的有效工具。可以大大提高自己的劳动效率,而且可以提高数据的准确性。我这里专注VBA,将我多年的经验汇集在VBA系列九套教程中。 作为我的学员要利用我的积木编程思想,积木编程最重要的是积木如何搭建…...
【力扣hot100题】(089)最长有效括号
这题目真是越做越难了。 但其实只是思路很难想到,一旦会了方法就很好做。 但问题就在方法太难想了…… 思路还是只要遍历一遍数组,维护动态规划数组记录截止至目前位置选取该元素的情况下有效括号的最大值。 光是知道这个还不够,看了答案…...
为什么需要「实体识别」以及 RAG如何和实体识别结合用
🤖 为什么要做「实体识别」? 实体识别(Named Entity Recognition, NER) 是自然语言处理(NLP)中的一种基础技术,它的目标是: 从文本中识别出“有意义”的实体信息,如人名…...
初级社会工作者考试精选题库
通过练习题库中的题目,考生能了解考试的题型、难度分布以及命题规律,明确备考的重点和难点,有针对性地复习知识点,避免盲目备考。 精选练习题 1、社会工作者小王在为社区孤寡老人提供服务时,总是把他们当成自己的父母来…...
Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification
Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification 目录 Transformer 训练:AutoModelForCausalLM,AutoModelForSequenceClassification`AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)`功能概述参数解释`AutoModelForSequen…...
图书管理系统(Python)
运行结果: 源代码: # 定义一个图书类 class Book: def __init__(self, title, author, isbn): self.title title self.author author self.isbn isbn def show_info(self): print(f"{self.title},{self.author},{self.isbn}") # 图书列表…...
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(4卷)任务书
2022年全国职业院校技能大赛 高职组 “大数据技术与应用” 赛项赛卷(4卷)任务书 背景描述:模块A:大数据平台搭建(容器环境)(15分)任务一:Hadoop 完全分布式安装配置任务二…...
装系统的一天!镜像系统!
虚拟机可以装系统,我们都知道,但是虚拟机可以装几个系统呢? macOS: 如何在 Windows 电脑上装 macOS 系统?_windows装mac-CSDN博客 Win10: Win10镜像(官方正版)下载及虚拟机配置(保姆级教程…...
Wincc脚本全部不运行
Wincc脚本全部不运行 前言解决办法操作步骤 前言 这里主要是指旧项目移植到Wincc的高版本,移植后界面的一些功能均会失效。(例如脚本不执行,项目编辑器不可用等情况) 解决办法 Wincc的项目文件中有Dcf文件,Dcf文件包…...
第三节:React 基础篇-React组件通信方案
React 组件通信方案详解及使用场景 以下是 React 组件通信的常用方法及其适用场景,以层级结构呈现: 一、父子组件通信 1. Props 传递 • 实现方式: • 父组件通过 props 向子组件传递数据。 • 子组件通过回调函数 (onEvent) 通知父组件更…...
✨ MOS开关的非线性因素详解 ✨
MOS 开关在模拟电路、开关电源等应用中广泛使用,但其导通特性存在非线性,可能导致信号失真或系统性能下降。以下是主要非线性因素及解决思路: 🔧 1. 导通电阻(Ron)的非线性 机理: Ron 并非固定值…...
解决vcpkg使用VS2022报错问题
转自个人博客:解决vcpkg使用VS2022报错问题 最近,在把Visual Studio2019完全更新到最新Visual Studio2022后,原使用的vcpkg无法正常安装包,会报如下与Visual Studio 2022相关的错误: error: in triplet x64-windows-m…...
基于支持向量回归(SVR)的空气质量预测
基于支持向量回归(SVR)的空气质量预测 1.作者介绍2.支持向量回归(SVR)算法介绍2.1 算法原理2.2 关键概念2.3算法特点2.4与其他回归方法对比 3.基于支持向量回归(SVR)的空气质量预测实验3.1数据集介绍3.2代码…...
【数据结构】排序
目录 1.排序的概念及其运用 1.1排序的概念 1.2常见排序算法 2插入排序 2.1直接插入排序 2.1.1基本思想 2.1.2代码实现 2.1.3特性总结 2.2 希尔排序 2.2.1基本思想 2.2.2代码实现 3.选择排序 3.1选择排序 3.1.1基本思想 3.1.2代码实现 3.1.3特性总结 3.2 堆排…...
4185 费马小定理求逆元
4185 费马小定理求逆元 ⭐️难度:简单 🌟考点:费马小定理 📖 📚 import java.util.Scanner; import java.util.Arrays;public class Main {static int[][] a;public static void main(String[] args) {Scanner sc …...
低代码控件开发平台:飞帆中粘贴富文本的控件
效果: 链接: https://fvi.cn/729...
偶氮二异丁腈(AIBN)的物化性质及其在合成中的应用
偶氮二异丁腈(AIBN)是一种常用的自由基引发剂,是一种白色结晶性粉末,不溶于水,但溶于甲醇、乙醇、丙酮、乙醚、甲苯等有机溶剂和乙烯基单体。 AIBN在60℃以上会分解形成异丁腈基,从而引发自由基反应。其分解温度区间为50ÿ…...
3.1.3.2 Spring Boot使用Servlet组件
在Spring Boot应用中使用Servlet组件,可以通过注解和配置类两种方式注册Servlet。首先,通过WebServlet注解直接在Servlet类上定义URL模式,Spring Boot会自动注册该Servlet。其次,通过创建配置类,使用ServletRegistrati…...
java——HashSet底层机制——链表扩容和树化
HashSet在Java中是基于HashMap实现的,它实际上是将所有元素作为HashMap的key存储,而value则统一使用一个静态的Object对象(Present)作为占位符。 1.举例演示 下面我们就举例说明一下,HashSet集合中,一个节点上的链表添加数据以及…...
玩转Docker | 使用Docker搭建Blog微博系统
玩转Docker | 使用Docker搭建Blog微博系统 前言一、Blog介绍项目简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Blog服务下载镜像创建容器检查容器状态设置权限检查服务端口安全设置四、访问Blog系统访问Blog首页登录Blog五、总结前言 在数字…...
Linux中的Vim与Nano编辑器命令详解
📢 友情提示: 本文由银河易创AI(https://ai.eaigx.com)平台gpt-4-turbo模型辅助创作完成,旨在提供灵感参考与技术分享,文中代码与命令建议通过官方渠道验证。 在Linux系统中,文本编辑是最常用的…...
G1垃圾回收器介绍
G1垃圾回收器简介 全称:Garbage-First Garbage Collector。目的:G1垃圾回收器是为了替代CMS垃圾回收器而设计的,它旨在提供更好的垃圾回收性能和可预测性,特别是在处理大内存堆时。特点:G1是一种服务器端的垃圾回收器…...
Python学习笔记(三)
文章目录 Python函数详解基本概念定义函数函数调用参数类型1. 位置参数2. 默认参数3. 关键字参数4. 可变参数 返回值函数作用函数中的变量作用域规则 递归函数Lambda函数函数注解装饰器文档字符串其他重要概念闭包生成器函数高阶函数 Python函数详解 基本概念 函数是Python中…...
Hqst的超薄千兆变压器HM82409S在Unitree宇树Go2智能机器狗的应用
本期拆解带来的是宇树科技推出的Go2智能机器狗,这款机器狗采用狗身体形态,前端设有激光雷达,摄像头和照明灯。在腿部设有12个铝合金精密关节电机,并配有足端力传感器,通过关节运动模拟狗的运动,并可做出多种…...
TaskFlow开发日记 #1 - 原生JS实现智能Todo组件
一、项目亮点 - 📌 **零依赖实现**:纯原生JavaScript CSS3 - 📌 **数据持久化**:LocalStorage自动同步 - 📌 **交互优化**:收藏置顶 动态统计 - 📌 **响应式设计**:完美适配移动端…...
es的告警信息
Elasticsearch(ES)是一个开源的分布式搜索和分析引擎,在运行过程中可能会产生多种告警信息,以提示用户系统中存在的潜在问题或异常情况。以下是一些常见的 ES 告警信息及其含义和处理方法: 集群健康状态告警 信息示例…...
vue实现在线进制转换
vue实现在线进制转换 主要功能包括: 1.支持2-36进制之间的转换。 2.支持整数和浮点数的转换。 3.输入验证(虽然可能存在不严格的情况)。 4.错误提示。 5.结果展示,包括大写字母。 6.用户友好的界面,包括下拉菜单、输…...
责任链设计模式(单例+多例)
目录 1. 单例责任链 2. 多例责任链 核心区别对比 实际应用场景 单例实现 多例实现 初始化 初始化责任链 执行测试方法 欢迎关注我的博客!26届java选手,一起加油💘💦👨🎓😄😂 最近在…...
Matlab 分数阶PID控制永磁同步电机
1、内容简介 Matlab 203-分数阶PID控制永磁同步电机 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
Java中LocalDateTime类
Java中的日期类 Date类LocalDateTime类创建LocalDateTime对象1 获取当前时间2 获取自己指定时间3 字符串创建日期 获取当前日期的信息1获取当前日期的年月日 时分秒2 获取当前日期周几\当年第几天\当月第几天3 获取当前⽇期所在周的周⽇和周⼀ 日期的运算1日期加减天数2 日期加…...
【C语言】--- 文件操作
文件操作 1. 为什么要使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 二进程文件和文本文件4. 文件的打开和关闭4.1 流和标准流4.1.1流4.2.2标准流 4.2 文件指针4.3 打开和关闭操作 5. 文件的顺序读写5.1 文件顺序读写函数5.1.1 fgetc 和 fputc5.1.2 fgets 和 fg…...
操作系统 4.4-从生磁盘到文件
文件介绍 操作系统中对磁盘使用的第三层抽象——文件。这一层抽象建立在盘块(block)和文件(file)之间,使得用户可以以更直观和易于理解的方式与磁盘交互,而无需直接处理磁盘的物理细节如扇区(se…...
第六章 进阶03 外包测试亮相
因为有年度重点项目,团队缺少测试资源,所以临时招聘了一个外包测试(后文用J代指),让产品经理亮亮来带她。 到今天J差不多入职有1个月时间了,亮亮组了个会,一起评审下J做的测试用例。 J展示了其…...
如何使用通义灵码完成PHP单元测试 - AI辅助开发教程
一、引言 在软件开发过程中,测试是至关重要的一环。然而,在传统开发中,测试常常被忽略或草草处理,很多时候并非开发人员故意为之,而是缺乏相应的测试思路和方法,不知道如何设计测试用例。随着 AI 技术的飞…...
使用 nano 文本编辑器修改 ~/.bashrc 文件与一些快捷键
目录 使用 nano 编辑器保存并关闭文件使用 sed 命令直接修改文件验证更改 如果你正在使用 nano 文本编辑器来修改 ~/.bashrc 文件,以下是保存并关闭文件的具体步骤: 使用 nano 编辑器保存并关闭文件 打开 ~/.bashrc 文件 在终端中运行以下命令…...
计算机组成原理——CPU与存储器连接例题
计算机组成原理——CPU与存储器连接例题 设CPU共有16根地址线和8根数据线,并用(MREQ) ̅作为访存控制信号(低电平有效),(WR) ̅作为读/写命令信号(高电平读,低电平写)。现有下列存储芯片&#…...
SQL 外键(Foreign Key)详细讲解
1. 什么是外键? 定义:外键是数据库表中的一列(或一组列),用于建立两个表之间的关联关系。外键的值必须匹配另一个表的主键(Primary Key)或唯一约束(Unique Con…...
B3647 【模板】Floyd
题目链接:点击进入 题目 思路 代码 #include <bits/stdc.h> #define inf 0x3f3f3f3f using namespace std; const int maxn 1e6 10;int n,m,g[110][5000];int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>m;memse…...
配置镜像端口和观察接口
top: 在G0/0/2上抓包通过其他端口ping pc4 可以看到 Wireshark 抓包没有任何反应,做个镜像端口并配置(观察接口和镜像接口) observe-port interface g0/0/2 #命令配置观察端口mirror to observe-port both …...