Spring Boot 日志和热部署

  1. 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.2src/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  日志记录效果

 

 

  1. 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  

 

 

  1. 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)的话就是一套测试集合

posted @   Monotonous  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示