Day02-Profile配置

131 阅读5分钟

关于Profile配置

Spring Boot框架很好的支持了Profile配置,它允许在项目中同时存在若干个配置文件,这些配置文件默认并不会被激活(被应用),你可以选择激活其中的某1个或多个。

在基于Spring Boot框架的项目中,application.properties是主配置文件,是始终被激活的,application-自定义名称.properties是Profile配置文件,需要被激活才会被应用的,例如:

image-20230221103409144.pngapplication.properties中,可以通过spring.profiles.active属性来激活某1个或多个Profile配置,此属性的值就是Profile配置文件的文件名中自定义的部分,例如:

image-20230221103509971.png 当同时被应用的多个配置文件中存在相同的属性,但配置值不同时:

  • Profile配置文件中的配置值优先级高于主配置文件中的配置值
  • 如果激活的多个Profile配置中的配置值冲突,按照激活顺序,后激活的配置优先级更高,例如激活为spring.profiles.active=test, dev,冲突时,以dev对应的配置为准

关于YAML配置

YAML是一种编写配置文件的语法,此类配置的文件的扩展名是.yml.yaml,在开发实践中,不与.properties同时使用。

相比.properties配置文件,YAML语法的特征:

  • 属性名中原本使用小数点分隔的,改为使用冒号和换行并空2格来表示,并且,每换行一次,增加2个空格
  • 多个属性名中相同的部分不需要写,只需要保证同样的缩进即可
  • 属性名与属性值之间使用1个冒号和1个空格进行分隔

例如:

spring.datasource.username=root
spring.datasource.password=P@assw0rd

则改为:

spring:
  datasource:
    username: root
    password: P@ssw0rd

其实,Spring系列框架并不支持YAML语法的配置文件,需要添加snakeymal工具包,在Spring Boot的基础依赖项中,已经包含此工具包,所以,在基于Spring Boot框架的项目中可以支持。

另外,在YAML中也支持使用小数点分隔属性名中的各部分。

**注意:**在分隔属性名的各部分时,换行后必须缩进2个空格,不可以是其它缩进方式!但是,在使用IntelliJ IDEA编写.yml文件的代码时,会自动将按下的TAB转换成2个空格!

**注意:**YAML文件对语法要求是严格的,且敏感的,如果语法错误,将无法解析此类文件,在开发实践中,如果语法错误不明显,可以尝试全部删除并重写配置代码!

使用YAML配置时,也支持Profile配置,规则完全相同。

关于SLF4j日志框架

在开发实践中,不允许使用System.out.println()或类似的输出语句!主要原因在于:

  • 输出效率低下
  • 在开发过程中输出的某些信息,不适合在测试环境或生产环境中被显示

推荐使用日志框架来输出各种信息,SLF4j是目前主流的日志框架,在Spring Boot的基础依赖项中已经包含相关的包。

当添加了Lombok依赖项后,可以在任何类上添加@Slf4j注解,则Lombok会在编译期自动声明名为log的变量,在类中,可以通过此变量调用方法来输出日志,例如:

@Slf4j
public class Slf4jTests {

    @Test
    void test() {
        log.info("这是一条日志!");
    }

}

在SLF4j中,根据日志信息的重要程度,从低到高,依次有5个级别:

  • trace:跟踪信息

    • 通常,希望仅开发人员可见
  • debug:调试信息

    • 通常,希望开发人员、测试人员可见
  • info:一般信息

    • 通常,不介意任何人可见
  • warn:警告信息

    • 通常,希望引起注意,但程序仍可运行
  • error:错误信息

    • 通常,需要重视,程序可能可以运行,可能存在隐患,但也可能是正常的

以上各级别都有对应的方法,所以,在使用SLF4j时,调用不同方法,就可以输出不同级别的日志,例如:

@Slf4j
public class Slf4jTests {

    @Test
    void test() {
        log.trace("这是一条【TRACE】日志!");
        log.debug("这是一条【DEBUG】日志!");
        log.info("这是一条【INFO】日志!");
        log.warn("这是一条【WARN】日志!");
        log.error("这是一条【ERROR】日志!");
    }

}

日志的显示级别是可控制的,当配置为某个显示级别时,只会显示此级别及更重要级别的日志!

在没有加载Spring Boot环境的情况下,SLF4j的默认显示级别是debug,所以,默认情况下,只会显示debug及更重要级别的日志,而trace不会被显示!

在加载Spring Boot环境的情况下,SLF4j的默认显示级别是info

在配置文件中,可以通过logging.level.根包名[.类名]属性来配置日志的显示级别,此属性的值就是你需要显示的日志的级别。

提示:以上属性名中,中括号框住的部分是可选的。

例如,配置为:

logging:
  level:
    cn.tedu.csmall: trace

提示:以上信息应该配置在各Profile配置文件中。

在SLF4j的API中,各显示级别的日志都有(String message, Object... args)参数列表的方法,在此方法中,第1个参数String message表示需要通过日志输出的信息,并且,在此信息中,如果需要输出某个或某些变量的值,可以使用{}进行占位,然后,通过第2个参数Object... args表示各占位符对应的值,例如:

int x = 1;
int y = 2;
System.out.println("x = " + x + ", y = " + y + ", x + y = " + (x + y));
log.debug("x = {}, y = {}, x + y = {}", x, y, x + y);

其实,SLF4j只是一个日志框架的标准,具体的日志相关功能并不是由它实现的,常见的实现了日志相关功能的日志框架有:log4jlogback等,SLF4j提供了这些日志框架向SLF4j标准的转换。