SpringBoot3快速入门笔记

springboot3简介

SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用(说明:SpringBoot底层是Spring)

大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术

特性:

● 快速创建独立 Spring 应用

                ○ SSM:导包、写配置、启动运行

● 直接嵌入Tomcat、Jetty or Undertow(无需部署 war 包)【Servlet容器】

                ○ linux  java tomcat mysql: war 放到 tomcat 的 webapps下

                ○ jar: java环境;  java -jar

● 重点:提供可选的starter,简化应用整合

                ○ 场景启动器(starter):web、json、邮件、oss(对象存储)、异步、定时任务、缓存...

                ○ 导包一堆,控制好版本。

                ○ 为每一种场景准备了一个依赖; web-starter(只需要导入这一个,所有有关web的依赖都会导入且会控制好版本)。mybatis-starter

重点:按需自动配置 Spring 以及 第三方库

                ○ 如果这些场景我要使用(生效)。这个场景的所有配置都会自动配置好。

                ○ 约定大于配置:每个场景都有很多默认配置。

                ○ 自定义:配置文件中修改几项就可以

● 提供生产级特性:如 监控指标、健康检查、外部化配置等

               ○ 监控指标、健康检查(k8s)、外部化配置

● 无代码生成、无xml

总结:简化开发,简化配置,简化整合,简化部署,简化监控,简化运维。

快速入门

 * 步骤:

 * ①创建maven项目,在pom.xml中导入依赖

 *         1 所有springboot项目都必须继承自 spring-boot-starter-parent

 *           <parent>

 *             <groupId>org.springframework.boot</groupId>

 *             <artifactId>spring-boot-starter-parent</artifactId>

 *             <version>3.0.5</version>

 *          </parent>

 *         2 导入web开发的场景启动器

 *             <dependency>

 *                  <groupId>org.springframework.boot</groupId>

 *                  <artifactId>spring-boot-starter-web</artifactId>

 *             </dependency>

 *  ②创建启动SpringBoot项目的主入口程序

 *        随便是那个类都可以,在该类上添加@SpringBootApplication注解,代表这是一个SpringBoot应用程序

 *        在方法中通过SpringApplication调用静态方法run(当前类.class,args)

 *  ③正常创建三层架构 

代码举例

Pom.xml文件

​
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 所有springboot项目都必须继承自 spring-boot-starter-parent --> <parent><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.0.5</version></parent> <groupId>com.atguigu</groupId> <artifactId>boot3-01-demo</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging><dependencies><!-- web开发的场景启动器 --> <dependency><groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><!--    SpringBoot应用打包插件--><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>​

<!--

mvn clean package把项目打成可执行的jar

java -jar demo.jar启动项目

-->

启动类:

@SpringBootApplication

public class Main {

    public static void main(String[] args) {

        SpringApplication.run(Main.class,args);

    }

}

注意

springboot的打包插件:

  <!--    SpringBoot应用打包插件-->

  <build>

    <plugins>

      <plugin>

        <groupId>org.springframework.boot</groupId>

        <artifactId>spring-boot-maven-plugin</artifactId>

        <version>${project.parent.version}</version> <!-- 与父模块一致 -->

      </plugin>

    </plugins>

  </build>

target目录下可以找到两个jar包,在文件路径下打开它,在改文件路径下打开终端窗口输入java -jar 文件名(回车);即可运行该项目

依赖管理机制

补充:

● 官方提供的场景:命名为:spring-boot-starter-*(官方默认提供了许多场景)

● 第三方提供场景:命名为:*-spring-boot-starter

starter(spring-boot-starter-web--->也叫web场景启动器)的starter(spring-boot-starter)

1、为什么导入starter-web所有相关依赖都导入进来?

(只要导入一个场景启动器,这个场景启动器会自动吧它用到的所有功能的以及相关的依赖导入)

      ● 开发什么场景,导入什么场景启动器。

      ● maven依赖传递原则。A-B-C: A就拥有B和C

      导入 场景启动器。 场景启动器 自动把这个场景的所有核心依赖全部导入进来

2、为什么版本号都不用写?

      每个boot项目都有一个父项目spring-boot-starter-parent

      ● parent的父项目是spring-boot-dependencies

      父项目 (spring-boot-dependencies)版本仲裁中心,把所有常见的jar的依赖版本都声明好了。

      ● 比如:mysql-connector-j

3、自定义版本号

      利用maven的就近原则

           ○ 直接在当前项目properties标签中声明父项目用的版本属性的key

           ○ 直接在导入依赖的时候声明版本

4   第三方的jar包

● boot父项目没有管理的需要自行声明好版本号

 自动配置机制

初步理解

● 自动配置的 Tomcat、SpringMVC 等

  ○ 导入场景,容器中就会自动配置好这些场景的核心组件。

代码测试:

@SpringBootApplication

public class Boot302DemoApplication {

    public static void main(String[] args) {

        //java10:局部变量类型的自动推断

        var ioc = SpringApplication.run(Boot302DemoApplication.class, args);

        //1 获取ioc容器中所有组件的名字------->SpringBoot把以前配置的核心组件都给我们配置好了。

        String[] names = ioc.getBeanDefinitionNames();

        for (String name:names) {

            System.out.println("name = " + name);

        }

    }

}

● 默认的包扫描规则

  ○ @SpringBootApplication 标注的类就是主程序类

  ○ SpringBoot只会扫描主程序所在的包及其下面的子包,自动的component-scan功能

  ○ 自定义扫描路径

    方式1 @SpringBootApplication(scanBasePackages = "com.atguigu")-----------用属性

    方式2 @ComponentScan("com.atguigu") 直接指定扫描的路径

本质: @SpringBootApplication=@ComponentScan+@SpringBootConfiguration+@EnableAutoConfiguration

● 配置默认值

  ○ 配置文件的所有配置项是和某个类的对象值进行一一绑定的。

  ○ 绑定了配置文件中每一项值的类: 属性类。

  ○ 比如:

    ■ ServerProperties绑定了所有Tomcat服务器有关的配置

    ■ MultipartProperties绑定了所有文件上传相关的配置

● 按需加载自动配置

  ○ 导入场景spring-boot-starter-web

  ○ 场景启动器除了会导入相关功能依赖,导入一个spring-boot-starter是所有starter的starter,基础核心starter

  ○ spring-boot-starter导入了一个包 spring-boot-autoconfigure包里面都是各种场景的AutoConfiguration自动配置类

  ○ 虽然全场景的自动配置都在 spring-boot-autoconfigure这个包,但是不是全都开启的。

    导入哪个场景就开启哪个自动配置

总结: 导入场景启动器、触发 spring-boot-autoconfigure这个包的自动配置生效、容器中就会具有相关场景的功能

常用注解

组件注解

@Configuration //说明这是一个配置类

@SpringBootConfiguration //代表此类是一个Springboot的配置类

@Bean、//替代bean标签

@Scope、//组件默认是单实例的,可以通过此注解设置单个还是多个

@Controller、 @Service、@Repository、@Component

@Import、//导入第三方组件到ioc容器(给容器中方指定类型的组件,组件的名字默认是全类名)

@ComponentScan

组件注册步骤:

1、@Configuration 编写一个配置类

2、在配置类中,自定义方法给容器中注册组件。配合@Bean

3、或使用@Import 导入第三方的组件

条件注解 

如果注解指定的条件成立,则触发指定行为

@ConditionalOnXxx

@ConditionalOnClass(name="类的权限定符"):如果类路径中存在这个类,则触发指定行为

@ConditionalOnMissingClass:如果类路径中不存在这个类,则触发指定行为

@ConditionalOnBean:如果容器中存在这个Bean(组件),则触发指定行为

@ConditionalOnBean(value=组件类型,name=组件名字):判断容器中是否有这个类型的组件,并且名字是指定的值

@ConditionalOnMissingBean:如果容器中不存在这个Bean(组件),则触发指定行为

注意:这些注解还可以用在类上;

放在类级别:如果注解判断生效整个配置配才生效;

放在方法级别:只是单独对这个方法判断;

场景:

● 如果存在FastsqlException这个类,给容器中放一个Cat组件,名cat01,

● 否则,就给容器中放一个Dog组件,名dog01

● 如果系统中有dog01这个组件,就给容器中放一个 User组件,名zhangsan

● 否则,就放一个User,名叫lisi

测试代码:

@SpringBootConfigurationpublic class AppConfig {@ConditionalOnClass(name="com.alibaba.druid.FastsqlException")@Beanpublic Cat cat01(){return new Cat();//组件名就是方法名}@ConditionalOnMissingClass(value="com.alibaba.druid.FastsqlException")@Beanpublic Dog dog01(){return new Dog();}@ConditionalOnBean(value= Dog.class)@Beanpublic User user1(){User user = new User();user.setUserName("zhangsan");return user;}@ConditionalOnMissingBean(value= Dog.class)@Beanpublic User user2(){User user = new User();user.setUserName("lisi");return user;}}

属性绑定

@ConfigurationProperties: 声明组件的属性和配置文件哪些前缀开始项进行绑定(名字要一致)(既能表在类上也能标在方法上,用了此注解,组件一定要加入到ioc容器)

@EnableConfigurationProperties:快速注册注解

常用于导入第三方组件进行属性绑定,springboot默认只扫描自己主程序所在的包,所以别人写好的类使用@Component与@ConfigurationProperties(prefix = "…")配置好了组件,我们也无法扫描到,所以只能使用@EnableConfigurationProperties配置属性值并将起放入到ioc容器中

将容器中任意组件(Bean)的属性值和配置文件的配置项的值进行绑定

步骤:

        ● 1、给容器中注册组件(@Component、@Bean)----------------组件只有在容器中才有这些功能

        ● 2、使用@ConfigurationProperties 声明组件和配置文件的哪些配置项进行绑定

@ConfigurationProperties+@Component代码举例:

文件:

pig.id=1

pig.name=佩奇

pig.age=5

要放入ioc的组件的类

@Component

@ConfigurationProperties(prefix = "pig")

/*

注意:配置文件的的名字只要与类中的属性名一一对应就可以赋值

 */

@Data

public class Pig {

    private Long id;

    private String name;

    private Integer age;

}

@EnableConfigurationProperties代码举例

配置文件:

sheep.id=2

sheep.name=苏西

sheep.age=4

实体类

@Data

@ConfigurationProperties(prefix = "sheep")//没有搭配@Component了因为在配置类上开启了开启组件的属性绑定

public class Sheep {

    private Long id;

    private String name;

    private Integer age;

}

在配置类上加:

@EnableConfigurationProperties(Sheep.class)

/**

 * 1 开启组件的属性绑定

 * 2 默认会将组件放入到ioc容器中

 * 注意:还是要使用@ConfigurationProperties(prefix = "sheep")指明前缀

 */

深入了解自动配置原理

springboot完整流程

①springboot怎么实现导入一个starter,写一些简单配置,应用就能跑起来,我们无需关心整合

②为什么tomcat的端口号可以配置在appliction.properties中,并且Tomcat能启动成功

③导入场景后那些自动配置能生效

1、导入starter-web:导入了web开发场景

            ● 1、场景启动器导入了相关场景的所有依赖:starter-json、starter-tomcat、springmvc

            ● 2、每个场景启动器都引入了一个spring-boot-starter,核心场景启动器。

            ● 3、核心场景启动器引入了spring-boot-autoconfigure包。

            ● 4、spring-boot-autoconfigure里面囊括了所有场景的所有配置。(所以导入的所有依赖都不需要写版本)--所有场景要用的组件在配置类里都写好了,这些配置类就在spring-boot-autoconfigure包中。

            ● 5、只要这个包下的所有类都能生效,那么相当于SpringBoot官方写好的整合功能就生效了。

            ● 6、SpringBoot默认却扫描不到 spring-boot-autoconfigure下写好的所有配置类。(这些配置类给我们做了整合操作),默认只扫描主程序所在的包。

2、主程序:@SpringBootApplication

                    ● 1、@SpringBootApplication由三个注解组成@SpringBootConfiguration、@EnableAutoConfiguratio、            @ComponentScan

                    ● 2、SpringBoot默认只能扫描自己主程序所在的包及其下面的子包,扫描不到 spring-boot-autoconfigure包中官方写好的配置类

                    ● 3、@EnableAutoConfiguration:SpringBoot 开启自动配置的核心。

                                   ○ 1. 是由@Import(AutoConfigurationImportSelector.class)提供功能:批量给容器中导入组件。

                                   ○ 2. SpringBoot启动会默认加载 142个配置类。

                                   ○ 3. 这142个配置类来自于spring-boot-autoconfigure下 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定的

                                   ○ 项目启动的时候利用 @Import 批量导入组件机制把 autoconfigure 包下的142 xxxxAutoConfiguration类导入进来(自动配置类)

                                  ○ 虽然导入了142个自动配置类

                   ● 4、按需生效:

                                 ○ 并不是这142个自动配置类都能生效

                                 ○ 每一个自动配置类,都有条件注解@ConditionalOnxxx,只有条件成立,才能生效

3、xxxxAutoConfiguration自动配置类

                 ● 1、给容器中使用@Bean 放一堆组件。

                 ● 2、每个自动配置类都可能有这个注解@EnableConfigurationProperties(ServerProperties.class),用来把配置文件中配的指定前缀的属性值封装到 xxxProperties属性类中

                 ● 3、以Tomcat为例:把服务器的所有配置都是以server开头的。配置都封装到了属性类中

                 ● 4、给容器中放的所有组件的一些核心参数,都来自于xxxProperties。xxxProperties都是和配置文件绑定。

                 ● 5、只需要改配置文件的值,核心组件的底层参数都能修改

4、写业务,全程无需关心各种整合(底层这些整合写好了,而且也生效了)

1、导入starter,就会导入autoconfigure包。

2、autoconfigure 包里面 有一个文件 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports,里面指定的所有启动要加载的自动配置类

3、@EnableAutoConfiguration 会自动的把上面文件里面写的所有自动配置类都导入进来(通过@Import批量导入)xxxAutoConfiguration(配置类) 是有条件注解进行按需加载

4、xxxAutoConfiguration给容器中导入一堆组件,组件都是从 xxxProperties(属性类,它绑定了配置文件,所以只要修改配置文件就可以修改组件参数)中提取属性值

5、xxxProperties又是和配置文件进行了绑定

效果:导入starter、修改配置文件,就能修改底层行为。

yaml文件语法

痛点:SpringBoot 集中化管理配置,application.properties

问题:配置多以后难阅读和修改,层级结构辨识度不高

YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(是另一种标记语言)。

                          ● 设计目标,就是方便人类读写

                          ● 层次分明,更适合做配置文件

                          ● 使用.yaml .yml作为文件后缀

1. 基本语法

          ● 大小写敏感

          ● 使用缩进表示层级关系k: v使用冒号+空格分割k,v

          ● 缩进时不允许使用Tab键,只允许使用空格。换行

          ● 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

          ● # 表示注释,从这个字符一直到行尾,都会被解析器忽略。

细节

● birthDay 推荐写为 birth-day

● 文本:\n在单引号内不生效,在双引号内生效)

  ○ 单引号不会转义【\n 则为普通字符串显示】

  ○ 双引号会转义【\n会显示为换行符】

例如:name:'zhangsan \n 123'---->打印:name=zhangsan \n 123

          name:"张三 \n 457"----》打印:name=张三(换行) 123

● 大文本

  ○ |开头,大文本写在下层,保留文本格式,换行符正确显示

  ○ >开头,大文本写在下层,折叠换行符(若没有缩进会压缩换行,即将换行变为空格;若有缩进则保留原文本格式)

例如:

    text:

      - abc

      - gii

      - |

        dogs:

          - dogName: xiaohei

            dogAge: 1

          - dogName: xiaohuang

            dogAge: 1

      - >

        cghdsku

        gsdvkj

        ghusduvch

打印:

● 多文档合并

  ○ 使用---可以把多个yaml文档合并在一个文档中,每个文档区依然认为内容独立

支持的写法:

         ● 对象:键值对的集合,如:映射(map)/ 哈希(hash) / 字典(dictionary)

         ● 数组:一组按次序排列的值,如:序列(sequence) / 列表(list)

         ● 纯量:单个的、不可再分的值,如:字符串、数字、bool、日期

.properties测试代码:

@Component@ConfigurationProperties(prefix = "person")//和配置文件person前缀的所有配置进行绑定@Data@NoArgsConstructor//自动生成一个无参构造器@AllArgsConstructor//自动生成一个全参构造器public class Person {private String name;private Integer age;private Date  birthDay;private Boolean like;private Child child;//嵌套对象private List<Dog> dogs;//数组(里面每一个元素又是一个对象)private Map<String,Cat> cats;//表示map}

child类

@Data

public class Child {

    private String name;

    private Integer age;

    private Date birthDay;

    private List<String> text;

}

dog类

@Data

public class Dog {

    private String dogName;

    private int dogAge;

}

cat类

@Data

public class Cat {

    private String catName;

    private int catAge;

}

Applicationl.properties文件

#properties表示复杂对象

person.name=张三

person.age=30

person.birthDay=1996/10/12 12:12:12

person.like=true

person.child.name=李四

person.child.age=12

person.child.brithDay=2013/12/12

person.child.text[0]=abc

person.child.text[1]=gcs

person.dogs[0].dogName=小黄

person.dogs[0].dogAge=1

person.dogs[1].dogName=小黑

person.dogs[1].dogAge=1

person.cats.c1.catName=小暖

person.cats.c1.catAge=1

person.cats.c2.catName=小白

person.cats.c2.catAge=1

#子对象用嵌套;数组用[];Map用.

.yaml测试代码:

person:

  name: zhangsan

  age: 30

  birthDay: 1996/12/10

  like: true

  child:

    name: lisi

    age: 12

    birthDay: 2013/2/23

  # text: ["abc","gdk"] 

    text:

      - abc

      - gii

  dogs:

    - dogName: xiaohei

      dogAge: 1

    - dogName: xiaohuang

      dogAge: 1

  cats:

    c1:

      catName: xiaonuan

      catAge: 1

    c2: {catName: xiaobai,catAge: 2}

      #对象也可以用{}表示

日志

整合原理

简介:

1. Spring使用commons-logging作为内部日志,但底层日志实现是开放的。可对接其他日志框架。

  a. spring5及以后 commons-logging被spring直接自己写了。

2. 支持 jul,log4j2,logback。SpringBoot 提供了默认的控制台输出配置,也可以配置输出为文件。

3. logback是默认使用的。

4. 虽然日志框架很多,但是我们不用担心,使用 SpringBoot 的默认配置就能工作的很好。

SpringBoot怎么把日志默认配置好的

1、每个starter场景,都会导入一个核心场景spring-boot-starter

2、核心场景引入了日志的所用功能spring-boot-starter-logging

3、默认使用了logback + slf4j 组合作为默认底层日志

4、日志是系统一启动就要用,xxxAutoConfiguration是系统启动好了以后放好的组件,后来用的。

5、日志是利用监听器机制配置好的。ApplicationListener。

6、日志所有的配置都可以通过修改配置文件实现。以logging开始的所有配置。

日志格式与记录日志

默认输出格式:

● 时间和日期:毫秒级精度

日志级别:ERROR, WARN, INFO, DEBUG, or TRACE.

● 进程 ID

● ---: 消息分割符

● 线程名: 使用[]包含

● Logger 名: 通常是产生日志的类名

消息: 日志记录的内容

注意: logback 没有FATAL级别,对应的是ERROR

记录日志:

Logger logger = LoggerFactory.getLogger(getClass());------------logger.info("要记录的内容")

或者使用Lombok的@Slf4j注解----------------log.info("要记录的内容")

例如:

@Slf4j

@RestController

public class HelloController {

    Logger logger = LoggerFactory.getLogger(getClass());

    @GetMapping("/h")

    public String hello(){

        /**

         * 实现:方法一进来就打印日志

         * 方法一:通过LoggerFactory调用getLogger(getClass())传入当前类-----得到一个 Logger对象logger,

         *                   通过对象logger调用info就可以记录想要的东西了

         * 方法二:注解@Slf4j中有一个log

         *                   通过log调用info也可以传入属性

         */

        logger.info("哈哈哈,方法进来了1");

        log.info("哈哈哈,方法进来了2");

        return "hello";

    }

}

日志级别

● 由低到高:ALL,TRACE, DEBUG, INFO, WARN, ERROR,FATAL,OFF;

  ○ 只会打印指定级别及以上级别的日志

  ○ ALL:打印所有日志

  ○ TRACE:追踪框架详细流程日志,一般不使用

  ○ DEBUG:开发调试细节日志

  ○ INFO:关键、感兴趣信息日志

  ○ WARN:警告但不是错误的信息日志,比如:版本过时

  ○ ERROR:业务错误日志,比如出现各种异常

  ○ FATAL:致命错误日志,比如jvm系统崩溃(logback 没有FATAL级别,对应的是ERROR

  ○ OFF:关闭所有日志记录

● 不指定级别的所有类,都使用root指定的级别作为默认级别

● SpringBoot日志默认级别是 INFO

1. application.properties/yaml中配置logging.level.<logger-name>=<level>指定日志级别(我们可以精确的调节某一个类的日志级别后某一个包下的日志级别)

2. level可取值范围:TRACE, DEBUG, INFO, WARN, ERROR, FATAL, or OFF,定义在 LogLevel类中

3. root 的logger-name叫root,可以配置logging.level.root=warn,代表所有未指定日志级别都使用 root 的 warn 级别

代码举例:

@Slf4j

@RestController

public class HelloController {

    Logger logger = LoggerFactory.getLogger(getClass());

    @GetMapping("/h")

    public String hello(String a,String b){

        log.trace("trac 日志....");

        log.debug("debug 日志....");

        log.info("info 日志....");

        log.warn("warn 日志....,参数a:{} b:{}",a,b);

        log.error("error 日志....");

        /**

         * 只打印了info,warn,error日志

         * springboot底层默认的日志级别是info(只会打印info及以后级别的日志)

         */

        return "hello";

    }

}

Applicaton.properties文件

#默认所有日志没有精确指定级别就使用root的默认级别(info)

#将默认级别调整为debug级别

logging.level.root=debug

#将controller包下的日志级别调整为warn级别

logging.level.com.atgiugu.logging1.controller=warn

日志分组

将相关的logger分组在一起,统一配置。SpringBoot 也支持。比如:Tomcat 相关的日志统一设置

例如:

#日志分组

#调整某个包下的日志级别

#logging.level.com.atgiugu.logging1.controller=debug

#logging.level.com.atgiugu.logging1.service=debug

#logging.level.com.aaa=debug

#logging.level.com.bbb=debug

logging.group.abc=com.atgiugu.logging1.controller,com.atgiugu.logging1.service,com.aaa,com.bbb

logging.level.abc=debug

springboot预定义了两个组

Name

        Loggers

Web        

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans

Sql        

org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

文件输出(将日志信息保存到文件中)

SpringBoot 默认只把日志写在控制台,如果想额外记录到文件,可以在application.properties中添加logging.file.name or logging.file.path配置项。

例如:

Application.properties文件

#指定日志文件的路径(只给了一个地址的话,会在指定路径下生成一个默认名字的文件)

#logging.file.path=

#指定日志文件的名

#logging.file.name=

#日志文件的名与路径都不配,那么默认配置文件只在控制台输出

#logging.file.name

#1 只写名字,就生成到当前项目同位置的demo.log

#logging.file.name=demo.log

#2 名字+路径,就生成到指定位置的指定文件

logging.file.name=C://demo.log

#注意:如果logging.file.path=与logging.file.name=同时存在,那么以logging.file.name优先

logging.file.name

        logging.file.path         

示例        

效果

未指定        

         未指定        

        仅控制台输出

指定        

         未指定        

   my.log        

写入指定文件。可以加路径

未指定

        指定        

  /var/log        

写入指定目录,文件名为spring.log

指定

        指定                

以logging.file.name为准

文件归档与滚动切割

归档:每天的日志单独存到一个文档中。

切割:每个文件10MB,超过大小切割成另外一个文件。

1. 每天的日志应该独立分割出来存档。如果使用logback(SpringBoot 默认整合),可以通过application.properties/yaml文件指定日志滚动规则。

2. 如果是其他日志系统,需要自行配置(文件名一定为log4j2.xml或log4j2-spring.xml)

3. 支持的滚动规则设置如下

配置项        

描述

logging.logback.rollingpolicy.file-name-pattern        

日志存档的文件名格式(默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz)

logging.logback.rollingpolicy.clean-history-on-start

应用启动时是否清除以前存档(默认值:false)

logging.logback.rollingpolicy.max-file-size        

存档前,每个日志文件的最大大小(默认值:10MB)

logging.logback.rollingpolicy.total-size-cap        

日志文件被删除之前,可以容纳的最大大小(默认值:0B)。设置1GB则磁盘存储超过 1GB 日志后就会删除旧日志文件

logging.logback.rollingpolicy.max-history        

日志文件保存的最大天数(默认值:7).

例如:

Application.properties文件:

#归档与切割

logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz

#${LOG_FILE}就是前面配置的文件名;%d{yyyy-MM-dd}格式化一个日期,是年月日;%i是当天的第几个文件;gz是压缩包格式

#只要文件攒够1MB就切割为一个单独文件

logging.logback.rollingpolicy.max-file-size=1MB

 

自定义日志系统

通常我们配置 application.properties 就够了。当然也可以自定义。比如:

日志系统        

自定义

Logback        

logback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy

Log4j2

        log4j2-spring.xml or log4j2.xml

JDK (Java Util Logging)        

logging.properties

自定以文件后,就按照自定义文件的规则来输出日志

如果可能,我们建议您在日志配置中使用-spring 变量(例如,logback-spring.xml 而不是logback.xml)。如果您使用标准配置文件,spring 无法完全控制日志初始化。

切换日志组合

利用maven的就近原则

步骤:①在spring-boot-starter中排除logback依赖(spring-boot-starter-logging)

          ②导入log4j2的依赖(spring-boot-starter-log4j2)

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-web</artifactId>

</dependency>

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

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-log4j2</artifactId>

</dependency>

导第三方日志如果它依赖了一个日志(jul),排除掉这个框架的默认日志

总结:

1. 导入任何第三方框架,先排除它的日志包,因为Boot底层控制好了日志

2. 修改 application.properties 配置文件,就可以调整日志的所有行为。如果不够,可以编写日志框架自己的配置文件放在类路径下就行,比如logback-spring.xml,log4j2-spring.xml

3. 业务中使用slf4j-api记录日志。不要再 sout 了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/77685.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记录centos8安装宝塔过程(两个脚本)

1、切换系统源&#xff08;方便使用宝塔安装脚本下载&#xff09; bash <(curl -sSL https://linuxmirrors.cn/main.sh) 2、宝塔安装脚本在宝塔的官网 宝塔面板下载&#xff0c;免费全能的服务器运维软件 根据自己的系统选择相应的脚本 urlhttps://download.bt.cn/insta…

Xdocreport实现根据模板导出word

只使用freemaker生成简单的word文档很容易&#xff0c;但是当word文档需要插入动态图片&#xff0c;带循环数据&#xff0c;且含有富文本时解决起来相对比较复杂&#xff0c;但是使用Xdocreport可以轻易解决。 Xdocreport既可以实现文档填充也可以实现文档转换&#xff0c;此处…

VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南

VMware Fusion Pro/Player 在 macOS 上的完整安装与使用指南—目录 一、VMware 产品说明二、下载 VMware Fusion三、安装前准备四、安装 VMware Fusion步骤 1&#xff1a;安装程序步骤 2&#xff1a;首次启动配置步骤 3&#xff1a;输入许可证 五、创建虚拟机步骤 1&#xff1a…

Redis常用数据结构和应用场景

一、前言 Redis提供了多种数据结构&#xff0c;每种结构对应不同的应用场景。本文对部分常用的核心数据结构和典型使用场景作出介绍。 二、String&#xff08;字符串&#xff09; 特点&#xff1a;二进制安全&#xff0c;可存储文本、数字、序列化对象等。场景&#xff1a; 缓…

spring security oauth2.0的四种模式

OAuth 2.0 定义了 4 种授权模式&#xff08;Grant Type&#xff09;&#xff0c;用于不同场景下的令牌获取。以下是每种模式的详细说明、适用场景和对比&#xff1a; 一、授权码模式&#xff08;Authorization Code Grant&#xff09; 适用场景 • Web 应用&#xff08;有后端…

Oracle 排除交集数据 MINUS

MINUS 是 Oracle 数据库中的一种集合操作符&#xff0c;用于返回第一个查询结果中存在但第二个查询结果中 不存在 的 唯一行。其核心功能是 排除交集数据&#xff0c;常用于数据差异分析或过滤特定记录 一、核心功能 排除交集&#xff1a;返回第一个查询结果中 不在第二个查询结…

WiFi那些事儿(四)

目录 一、IEEE 802.11ah标准简介 二、IEEE 802.11ah信道特点 三、IEEE 802.11ah传输模式 在WiFi通信领域&#xff0c;信号绕射能力一直是一个关键问题。常规的WiFi设备多工作在2.4GHz和5GHz频段&#xff0c;这些频段的电磁波波长通常小于障碍物尺寸&#xff0c;受电磁波本身…

C++在Linux上生成动态库并调用接口测试

加减乘除demo代码 项目结构 CPP/ ├── calculator.cpp ├── calculator.h ├── main.cpp 头文件 #ifndef CALCULATOR_H #define CALCULATOR_H#ifdef __cplusplus extern "C" {#endifdouble add(double a, double b);double subtract(double a, double b…

离线密码生成器:安全可靠的密码管理解决方案

离线密码生成器&#xff1a;安全可靠的密码管理解决方案 在当今数字时代&#xff0c;我们每天都需要使用各种网站和应用程序&#xff0c;每个账户都需要一个强密码来保护我们的个人信息和隐私。然而&#xff0c;记住多个复杂的密码几乎是不可能的任务。今天&#xff0c;我要向…

ChatRex: Taming Multimodal LLM for Joint Perception and Understanding 论文理解和翻译

一、TL&#xff1b;DR MLLM在感知方面存在不足&#xff08;远远比不上专家模型&#xff09;&#xff0c;比如Qwen2-VL在coco上recall只有43.9%提出了ChatRex&#xff0c;旨在从模型设计和数据开发两个角度来填补这一感知能力的缺口ChatRex通过proposal边界框输入到LLM中将其转…

自动驾驶技术-相机_IMU时空标定

自动驾驶技术-相机_IMU时空标定 时间延迟 时间延迟 参考链接1、2 相机主要分为全局和卷帘快门相机&#xff0c;从触发到成像的过程包括&#xff1a;复位时间、AE()曝光时间、读出时间 全局快门如下图所示 卷帘快门如下图所示 相机录制视频时&#xff0c;为了保持固定频率&am…

Vue3 + Vite + TS,使用 Web Worker,web worker进阶 hooks

worker 具体通讯方式 1.由 web page 发送消息- worker.postMessage(发送数据) 2.web worker 接收消息并执行相关逻辑- onmessage (e) > { 接收数据并处理逻辑postMessage(传递处理后的数据)} 3.由 web page 监听 worker 消息&#xff0c;包括&#xff1a;- 处理数据的监听…

AIDD-人工智能药物设计-AI 精准预测蛋白质变构位点

Allo-PED: AI 精准预测蛋白质变构位点 目录 Allo-PED 框架融合蛋白质语言模型与结构特征,显著提高了变构位点预测的准确性和泛化能力。EcoFoldDB 利用蛋白质结构信息,为宏基因组提供了精确且可扩展的生态功能注释新方法,显著提升了对未知微生物功能的认知。上下文分子适配(…

1558 找素数

1558 找素数 ⭐️难度&#xff1a;中等 &#x1f31f;考点&#xff1a;质数 &#x1f4d6; &#x1f4da; import java.util.Scanner; import java.util.Arrays;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int a sc.…

Nacos 提供了哪些服务的保护机制?

当面试官问这个问题时&#xff0c;大家一定要保持头脑清醒&#xff0c;不要被带跑偏了&#xff0c;Nacos 本身的核心定位是服务发现和配置管理中心&#xff0c;它并不直接提供像服务熔断、服务限流、服务降级、请求重试 这类完整的、开箱即用的客户端/网关级服务保护&#xff0…

【家政平台开发(38)】解锁家政平台国际化密码:多语言支持开发实战

> 本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质…

DirectX12 - 基本知识 - 图形驱动的本质

这里是SunshineBooming&#xff0c;GPU公司一枚小小的Driver工程师&#xff0c;主要工作是写DirectX12 Driver&#xff0c;我会持续更新这个DX12 Spec系列&#xff0c;可能比较冷门&#xff0c;但是都是干货和工作中的心得体会&#xff0c;有任何GPU相关的问题都可以在评论区互…

selenium元素获取

from selenium import webdriver from selenium.webdriver.common.by import Bydriver webdriver.Chrome()driver.maximize_window()#最大化窗口 #隐式等待 driver.implicitly_wait(10)#打开网页 driver.get("https://www.zhipin.com/beijing/?kacity-sites-101010100&q…

生物化学笔记:医学免疫学原理15 超敏反应过敏反应(I型[蚊虫叮咬]+II型[新生儿溶血症、突眼型甲亢]+III型+IV型)

超敏反应 每个人都可能发生的过敏问题&#xff1a;被蚊子咬后起包 I型超敏反应 II型超敏反应 新生儿溶血症分为Rh血型不合和ABO血型不合两种情况。Rh血型不合通常从第二胎开始更容易发病&#xff0c;因为母体初次接触Rh阳性胎儿的红细胞后会产生抗D抗体&#xff0c;而这个致敏…

【android bluetooth 框架分析 02】【Module详解 2】【gd_shim_module 模块介绍】

1. 背景 上一章节 我们介绍了 module_t 的 大体框架 &#xff0c;本节内容我们就选择 我们的 gd_shim_module 模块为例子&#xff0c;具体剖析一下&#xff0c;它里面的逻辑。 static const char GD_SHIM_MODULE[] "gd_shim_module";// system/main/shim/shim.cc …