- SpringBoot 日志记录
1.1 SpringBoot 日志分类
Spring Boot 即支持log4j 也支持logback 日志记录。
logback 是log4j的扩展,性能要比log4j高很多。
Spring Boot默认的日志框架Logback。
|
1.2 logback 日志记录实现
1.2.1.在spring Boot 中如果引入了spring-boot-starter或spring-boot-starter-web启动器,其中包含了spring-boot-starter-logging启动器,里面有Logback的jar包 。
1.2.2.只需要在src/main/resources目录下有一个logback.xml文件
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <property name="LOG_HOME" value="${catalina.base}/logs/" /> <!-- 控制台输出 --> <appender name="Stdout" class="ch.qos.logback.core.ConsoleAppender"> <!-- 日志输出编码 --> <layout class="ch.qos.logback.classic.PatternLayout"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> </appender> <!-- 按照每天生成日志文件 --> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <FileNamePattern>${LOG_HOME}/server.%d{yyyy-MM-dd}.log</FileNamePattern> <MaxHistory>30</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n </pattern> </layout> <!--日志文件最大的大小--> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <MaxFileSize>10MB</MaxFileSize> </triggeringPolicy> </appender>
<!-- 日志输出级别 --> <root level="debug"> <appender-ref ref="Stdout" /> <appender-ref ref="RollingFile" /> </root> <!--日志异步到数据库 --> <!-- <appender name="DB" class="ch.qos.logback.classic.db.DBAppender"> 日志异步到数据库 <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource"> 连接池 <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource"> <driverClass>com.mysql.jdbc.Driver</driverClass> <url>jdbc:mysql://127.0.0.1:3306/databaseName</url> <user>root</user> <password>root</password> </dataSource> </connectionSource> </appender> --> </configuration>
|
1.2.3 日志记录效果
1.3 log4J 日志记录实现
1.3.1 打开pom.xml文件,去掉logback的坐标,引入log4j的坐标。
<!--排除 commons‐logging--> <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>
<!--引入log4j2 相对于log4j有很大的变动--> <!--<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>--> <!--引入log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency>
|
1.3.2在src/main/resources目录下放有一个log4j.properties文件
log4j.rootCategory=ERROR, CONSOLE ,LOGFILE
log4j.logger.com.xz.mapper=DEBUG
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%C %p %m %n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:/my.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%C %m %L %n
|
|
1.3.3 日志记录效果
- Spring Boot 热部署
2.1 什么是热部署
在服务不停止的情况下,完成项目部署处理。
原因:在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受。
|
2.2 Spring Boot热部署的方式分为2种
1.Spring Loader 插件
特点:在部署项目时使用的是热部署的方式,不重启服务的情况下重新部署项目。
只能对后台java代码进行部署处理,对页面无能为力。
2.DevTools 工具
特点:在部署项目时使用的是重新部署方式,需要重新启动服务。对java代码和页面都有效。
原理:深层原理是使用了两个ClassLoader,
一个Classloader加载那些不会改变的类(第三方Jar包),
另一个ClassLoader加载会更改的类,称为restart ClassLoader,
这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,
重新创建一个restart ClassLoader,由于需要加载的类相比较少,
所以实现了较快的重启时间。
|
2.3 DevTools 热部署实现
2.3.1 创建springboot项目
2.3.2 打开pom.xml,查看坐标,并加上配置
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<!--devtools坐标--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope>
<!--如果有继承,子项目将不继承坐标--> <optional>true</optional> </dependency>
<plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration>
<!-- 如果没有该配置,devtools不会生效。
在maven编译的时候新创建一个虚拟机执行。
这个新创建 JVM 就是这里的 fork。它速度会稍慢一些,但是隔离性非常好。--> <fork>true</fork>
</configuration> </plugin> </plugins>
|
2.3.3 编写控制器和页面测试代码
@Controller public class TestController { @RequestMapping("/test") public String test(){ System.out.println("hello mm aaa"); return "index"; } }
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>测试页面</title> </head> <body> <h1>hello aaa!!!!</h1> </body> </html>
|
注意:
IDEA的话,热部署还不会生效,因为devTools只会在类路径上的文件发生更改时才会自动重启,而IDEA默认不会自动编译。解决方法有两种:
1、手动:修改完代码,按快捷键Ctrl+F9,手动构建项目,或者只修改单个类文件的话,按Ctrl+Shift+F9,重新编译该类文件,即可触发重启服务。
2、自动:需要进行如下配置
|
2.3.4 IDEA配置自动编译
1. ctrl + shift + A,输入automatically,选择如图所示点击进入
2.然后ctrl + shift + alt + /,选择如下图所示点击进入
保存重启,之后修改文件进行测试即可。
SpringLoader热部署参考:https://blog.csdn.net/u013294097/article/details/87874817
- Spring Boot 整合Junit单元测试
3.1 创建springboot的项目
3.2 打开pom.xml,查看坐标
<!--spring boot web的启动器坐标-->
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<!--Junit环境的启动器坐标--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
<!--Junit的坐标-->
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency>
|
3.3 编写业务代码
@Service public class UserServiceImpl implements UserService { @Override public void addUser() { System.out.println("insert into users...."); } }
|
3.4 Junit测试类,编写测试代码
/** * @RunWith(SpringJUnit4ClassRunner.class):启动器,让junit和spring环境进行整合
* @SpringBootTest : 当前是一个SpringBoot的测试类。 */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest class SpringBootTestApplicationTests { @Autowired UserService userService;
@Test public void testAddUser() { userService.addUser(); } }
|
注解说明:
@RunWith : 在JUnit中有很多个Runner,他们负责调用你的测试代码,每一个Runner都有各自的特殊功能,你要根据需要选择不同的Runner来运行你的测试代码。 如果我们只是简单的做普通Java测试,不涉及Spring Web项目,你可以省略@RunWith注解,这样系统会自动使用默认Runner来运行你的代码。 –@RunWith就是一个运行器 –@RunWith(JUnit4.class)就是指用JUnit4来运行 –@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境,以便在测试开始的时候自动创建Spring的应用上下文 –@RunWith(Suite.class)的话就是一套测试集合
|
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)