主要步骤
- 一、在springboot项目中配置application.yml
- 二、在apollo平台上配置对应的namespace及logback配置
- 三、在SpringBoot启动类上添加@EnableApolloConfig
- 四、通过Java SystemProperty指定Apollo启动相关环境配置
- 五、校验配置是否生效
参考:
https://github.com/ctripcorp/apollo/pull/1614
springboot logging模块启动顺序默认在apollo模块之前,因此apollo中配置的日志相关配置并未生效,
在apollo1.2+版本后提供了eager加载配置,这种方式使得Apollo的加载顺序放到了日志系统加载之前,
会导致Apollo的启动过程无法通过日志的方式输出(因为执行Apollo加载的时候,日志系统压根没有准备好呢!所以在Apollo代码中使用Slf4j的日志输出便没有任何内容)
这种加载时间太靠前的方式不是必选的,通过参数apollo.bootstrap.eagerLoad.enabled可控制是否走这种逻辑,
在SpringBoot中配置日志优先于apollo加载,主要分为以下几步:
一、在springboot项目中配置application.yml
apollo-client maven依赖如下:
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.3.0</version>
</dependency>
SpringBoot项目中application.yml配置如下:
# apollo配置
apollo:
# 启用apollo boot 配置
bootstrap:
enabled: true
# 使Apollo的加载顺序放到日志系统加载之前
eagerLoad:
enabled: true
# 注入命名空间(多个namespace间英文逗号分隔)
namespaces: application.yml
二、在apollo平台上配置对应的namespace及logback配置
然后在apollo对应的app下新建namespace: application.yml且设置logback配置如下:
#设置日志级别
logging:
level:
root: debug
pattern:
console: >-
%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint}
%clr(${LOG_LEVEL_PATTERN:-%5p})
%clr(${PID:- }){magenta}
%clr(---){faint}
%clr([%15.15t]){faint}
%clr(%-40.40logger{39}){cyan}
%clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
file: >-
%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}
${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} :
%m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}
file:
# 日志文件名称及路径
name: /data/logs/mx_svc_gateway/mx_svc_gateway.log
logback:
rollingpolicy:
# 重启时是否删除原日志
clean-history-on-start: false
# 滚动文件命名模式
file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz
# 单日志文件大小
max-file-size: 10MB
# 保留的最大归档文件数量
max-history: 100
三、在SpringBoot启动类上添加@EnableApolloConfig
在SpringBoot项目起送类上添加@EnableApolloConfig注解,且其中value需与第一步中的apollo.bootstrap.namespaces相同
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* Spring启动类
*
* @author luohq
* @date 2020/03/03
*/
@SpringBootApplication
//启用apollo配置中心
@EnableApolloConfig("application.yml")
public class MxSvcGatewayApplication {
public static void main(String[] args) {
SpringApplication.run(MxSvcGatewayApplication.class, args);
}
}
实际使用过程中,若启动类不添加@EnableApolloConfig注解,会报如下警告:
--2021-03-03 10:56:30.688 - WARN 8952 --- [ main] o.s.b.c.p.PropertySourcesDeducer :
Multiple PropertySourcesPlaceholderConfigurer beans registered
[propertySourcesPlaceholderConfigurer, org.springframework.context.support.PropertySourcesPlaceholderConfigurer],
falling back to Environment
四、通过Java SystemProperty指定Apollo启动相关环境配置
Java项目启动相关apollo环境系统属性
# appId
-Dapp.id=mx-svc-gateway
# apollo meta服务url
-Dapollo.meta=http://xxx.myapollo.com:8080
# apoll配置缓存目录
-Dapollo.cacheDir=/mx-apollo-cache-dir
# apollo集群配置
-Dapollo.cluster=luo
开发时可以指定应用启动VM Options
而在线上部署服务时,可在Java启动命令上直接拼接如上系统属性,
亦可以通过暴露环境变量,然后将环境变量值转换为对应的系统属性。
java -jar myapp.jar
-Dapp.id=mx-svc-gateway
-Dapollo.meta=http://xxx.myapollo.com:8080
-Dapollo.cacheDir=/mx-apollo-cache-dir
-Dapollo.cluster=luo
五、校验配置是否生效
如上几步配置完成后,通过修改logging.level.root=debug|info后重启服务,即可看到最终的日志配置是否生效。