首先说明我目前的SpringBoot环境。我建立了三个服务,分别是服务治理(service-govern),配置服务(service-config),应用服务(service-security)。我这里的所有的说明全部基于应用服务(service-security)。service-security和service-config这两个服务已经成功注册到了service-govren中。
SpringBoot加载多个配置文件
这里我基于修改service-security来进行说明。目前我的service-security的配置信息是
spring:
application:
name: service-security
profiles:
active:
- dev
- prod
cloud:
config:
name: service-security
discovery:
enabled: true
service-id: service-config
label: master
profile: dev
logging:
path: D:/tmp/logs
config: classpath:service-security-log.xml
eureka:
instance:
appname: service-security
prefer-ip-address: true
client:
service-url:
defaultZone: http://admin:admin@localhost:8761/eureka
在上面的配置信息中参数spring.cloud.config.name和参数spring.cloud.config.profile组合形成了在配置服务中的配置文件中,根据我这里的配置形成的文件名就是service-security-dev.yml。但是当我们把这两个配置信息删除后,如下图所示
SpringBoot就会自动读取spring.application.name参数和spring.profiles.active参数。形成对应的文件名称。由于spring.profiles.active参数为一个list对象,因此我们可以配置多个。如我配置的信息为dev(开发环境)和prod(生产环境)。因此系统加载时就会形成两个配置文件即service-security-dev.yml和service-security-prod.yml。 如下面显示的加载信息:
2018-12-28 10:18:20.195 INFO 77936 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Fetching config from server at : http://192.168.99.4:9000/
2018-12-28 10:18:20.373 INFO 77936 --- [ main] c.c.c.ConfigServicePropertySourceLocator : Located environment: name=service-security, profiles=[dev,prod], label=master, version=null, state=null
2018-12-28 10:18:20.373 INFO 77936 --- [ main] b.c.PropertySourceBootstrapConfiguration : Located property source: CompositePropertySource {name='configService', propertySources=[MapPropertySource {name='file:F:/git/cloud/service-security-prod.yml'}, MapPropertySource {name='file:F:/git/cloud/service-security-dev.yml'}]}
系统就找到了两个配置文件,进行加载。根据这个理论,我们可以在spring.profiles.active参数中配置多个名称来进行加载多个配置文件。
日志配置文件中读取SpringBoot配置文件中的变量信息
另外由于我们在进行日志配置时,一般会创建一个单独的日志配置文件。如我的日志配置信息如下:
系统读取的配置文件为service-security-log.xml。但是这里我有一个需求,就是要求当系统以dev(开发环境)或prod(生产环境)启动时要使用不同的配置信息,而且生成的日志文件为spring.application.name+时间为名称。这样我们就需要写多个不同的配置文件,这样就太麻烦了。因此在日志配置中提供了springProfile标签和springProperty标签两个标签来实现这个功能。其中springProperty标签用于读取springboot中的属性信息。代码如下:
<springProperty scope="context" name="filePath" source="logging.path" defaultValue="D:/tmp/logs" />
<springProperty scope="context" name="fileName" source="spring.application.name" />
其中name指定在日志文件中的变量名称,source指定在springboot中的变量名称,这个配置相当于把springboot中指定的spring.application.name的值赋给fileName变量,logging.path变量值赋给filePath变量并设置默认值。这样我们在下面就可以直接使用fileName变量和filePath变量进行配置文件名信息了。如下所示
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${filePath}/${fileName}.%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>30</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n</pattern> -->
<pattern>%d [%p\t] %t %c:%file:%line- %m%n</pattern>
</encoder>
<!--日志文件最大的大小 -->
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>10MB</MaxFileSize>
</triggeringPolicy>
</appender>
上面这个配置指定了以变量filePath为路径,变量fileName和时间为文件名的日志文件。而且每天生成一个新的文件,文件最大为10MB。
下面我们就可以根据当前系统的运行环境来进行设置进行哪一种方式的输出了。而这时我们就用到了springProfile标签。如下面代码所示:
<springProfile name="dev,test">
<!-- 默认输出级别为debug,通过控制台输出 -->
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
<!-- 当生产环境时激活 -->
<springProfile name="prod">
<!-- 默认输出级别为info,通过控制台输出 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</springProfile>
在springProfile文件中name属性用于指定运行环境,如name="dev,test",即当运行环境为开发环境和测试环境时使用下面的level="DEBUG"配置信息。
而当name="prod"(生产环境)时,则使用level="INFO"的配置信息。