一、多环境
application.properties 是 springboot 在运行中所需要的配置信息。
当我们在开发阶段,使用自己的机器开发,测试的时候需要用的测试服务器测试,上线时使用正式环境的服务器。
这三种环境需要的配置信息都不一样,当我们切换环境运行项目时,需要手动的修改多出配置信息,非常容易出错。
为了解决上述问题,springboot 提供多环境配置的机制,让开发者非常容易的根据需求而切换不同的配置环境。
在 src/main/resources 目录下创建三个配置文件:
1 2 3
| application-dev.properties:用于开发环境 application-test.properties:用于测试环境 application-prod.properties:用于生产环境
|
我们可以在这个三个配置文件中设置不同的信息,application.properties 配置公共的信息。
在 application.properties 中配置:
spring.profiles.active=dev
表示激活 application-dev.properties 文件配置, springboot 会加载使用 application.properties 和 application-dev.properties 配置文件的信息。
同理,可将 spring.profiles.active 的值修改成 test 或 prod 达到切换环境的目的。
切换项目启动的环境不仅对读取配置文件信息有效,也可以对 Bean 有效。
当我们需要对不同环境使用不同的 Bean 时,可以通过 @Profile 注解进行区分,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| @Configuration public class BeanConfiguration {
@Bean @Profile("dev") public Runnable test1() { System.out.println("开发环境使用的 Bean"); return () -> {}; }
@Bean @Profile("test") public Runnable test2() { System.out.println("测试环境使用的 Bean"); return () -> {}; }
@Bean @Profile("pro") public Runnable test3() { System.out.println("生成环境使用的 Bean"); return () -> {}; } }
|
当启动项目后,Spring 会根据 spring.profiles.active 的值实例化对应的 Bean。
二、日志介绍
Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种Logger都可以通过配置使用控制台或者文件输出日志内容。
SLF4J —— Simple Logging Facade For Java,它是一个针对于各类Java日志框架的统一Facade抽象。Java日志框架众多——常用的有java.util.logging, log4j, logback,commons-logging, Spring框架使用的是Jakarta Commons Logging API(JCL)。而SLF4J定义了统一的日志抽象接口,而真正的日志实现则是在运行时决定的——它提供了各类日志框架的绑定。
Logback是log4j框架的作者开发的新一代日志框架,它效率更高、能够适应诸多的运行环境,同时天然支持SLF4J。
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。在运行应用程序和其他例子时,你应该已经看到很多INFO级别的日志了。
三、配置 logback
spring boot 默认会加载 classpath:logback-spring.xml 或者 classpath:logback-spring.groovy。
如需要自定义文件名称,在 application.properties 中配置 logging.config 选项即可。
在 src/main/resources 下创建 logback-spring.xml 文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| <?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 文件输出格式 --> <property name="PATTERN" value="%-12(%d{yyyy-MM-dd HH:mm:ss.SSS}) |-%-5level [%thread] %c [%L] -| %msg%n" /> <!-- test文件路径 --> <property name="TEST_FILE_PATH" value="d:/test.log" /> <!-- pro文件路径 --> <property name="PRO_FILE_PATH" value="/opt/test/log" />
<!-- 开发环境 --> <springProfile name="dev"> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>${PATTERN}</pattern> </encoder> </appender> <logger name="com.light.springboot" level="debug" /> <root level="info"> <appender-ref ref="CONSOLE" /> </root> </springProfile>
<!-- 测试环境 --> <springProfile name="test"> <!-- 每天产生一个文件 --> <appender name="TEST-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 文件路径 --> <file>${TEST_FILE_PATH}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 文件名称 --> <fileNamePattern>${TEST_FILE_PATH}/info.%d{yyyy-MM-dd}.log</fileNamePattern> <!-- 文件最大保存历史数量 --> <MaxHistory>100</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${PATTERN}</pattern> </layout> </appender> <logger name="com.light.springboot" level="debug" /> <root level="info"> <appender-ref ref="TEST-FILE" /> </root> </springProfile>
<!-- 生产环境 --> <springProfile name="prod"> <appender name="PROD_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${PRO_FILE_PATH}</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${PRO_FILE_PATH}/warn.%d{yyyy-MM-dd}.log</fileNamePattern> <MaxHistory>100</MaxHistory> </rollingPolicy> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${PATTERN}</pattern> </layout> </appender> <root level="warn"> <appender-ref ref="PROD_FILE" /> </root> </springProfile> </configuration>
|
其中,springProfile 标签的 name 属性对应 application.properties 中的 spring.profiles.active 的配置。
即 spring.profiles.active 的值可以看作是日志配置文件中对应的 springProfile 是否生效的开关。
四、配置 log4j2
4.1 添加依赖
1 2 3 4
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
|
4.2 配置日志文件
spring boot 默认会加载 classpath:log4j2.xml 或者 classpath:log4j2-spring.xml。
如需要自定义文件名称,在 application.properties 中配置 logging.config 选项即可。log4j2.xml 文件内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <?xml version="1.0" encoding="utf-8"?> <configuration> <properties> <!-- 文件输出格式 --> <property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property> </properties> <appenders> <Console name="CONSOLE" target="system_out"> <PatternLayout pattern="${PATTERN}" /> </Console> </appenders> <loggers> <logger name="com.light.springboot" level="debug" /> <root level="info"> <appenderref ref="CONSOLE" /> </root> </loggers> </configuration>
|
log4j2 不能像 logback 那样在一个文件中设置多个环境的配置数据,只能命名 3 个不同名的日志文件,分别在 application-dev,application-test 和 application-prod 中配置 logging.config 选项。
除了在日志配置文件中设置参数之外,还可以在 application-*.properties 中设置,日志相关的配置:
1 2 3 4 5 6 7 8 9
| logging.config # 日志配置文件路径,如 classpath:logback-spring.xml logging.exception-conversion-word # 记录异常时使用的转换词 logging.file # 记录日志的文件名称,如:test.log logging.level.* # 日志映射,如:logging.level.root=WARN,logging.level.org.springframework.web=DEBUG logging.path # 记录日志的文件路径,如:d:/ logging.pattern.console # 向控制台输出的日志格式,只支持默认的 logback 设置。 logging.pattern.file # 向记录日志文件输出的日志格式,只支持默认的 logback 设置。 logging.pattern.level # 用于呈现日志级别的格式,只支持默认的 logback 设置。 logging.register-shutdown-hook # 初始化时为日志系统注册一个关闭钩子
|