springbootlogback如何从apollo配置中⼼读取变量
⽬录
springbootlogback从apollo配置中⼼读取变量1、在apollo配置中⼼添加2、项⽬的application.yml配置⽂件配置如下3、在logback.xml配置springProperty标签SpringBootLogback⽆法获取配置中⼼属性如何解决解决⽅案
springboot logback 从apollo配置中⼼读取变量
1、在apollo配置中⼼添加
logback-config.properties配置⽂件
2、项⽬的application.yml配置⽂件配置如下
主要是eagerLoad.enabled: true这个配置
app:
id: SX-sale-app-soaapollo:
bootstrap: enabled: true
#将Apollo配置加载提到初始化⽇志系统之前 eagerLoad: enabled: true
namespaces: application.yml,logback-config
3、在logback.xml配置springProperty标签
设置好标签名称和配置中⼼变量名称的,使⽤的时候${name}引⼊该变量
${logstash.host} ${logstash.port} {\"appname\":\"server-user\
这个是后启动⽇志中会报如下错误:
20:26:50,683 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@120:31 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]20:26:50,683 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@121:58 - no applicable action for [logger], current ElementPath is [[configuration][springProfile][logger]]
20:26:50,683 |-ERROR in ch.qos.logback.core.joran.spi.Interpreter@132:42 - no applicable action for [appender-ref], current ElementPath is [[configuration][springProfile][logger][appender-ref]]
这是因为⽇志⽂件的名称是logback.xml的话,logback会在SpringCloud和apollo配置加载之前加载⽇志配置,这时⽇志⽂件中的springProfile的配置是⽆效的。所以根据官⽅⽂档说明,需要将logback.xml改为logback-spring.xml,然后报错就没有了。
注:虽然logback.xml⽂件名启动时会报错,但是不影响实际效果,猜测是因为上边第⼆步中的配置会在后边再次加载logback⽇志,所以logback依然会产⽣效果,但是对于有代码洁癖的⼈来说,没有任何报错和异常才是最舒服的。
SpringBoot Logback⽆法获取配置中⼼属性
最近在做项⽬中,需要把项⽬中的⽇志信息通过RabbitMQ将规定格式的消息发送到消息队列中,然后ELK系统通过消息队列拿⽇志并且保存起来,在⽇志的配置⽂件(logback-spring.xml)中我们需要加⼊RabbitMQ的配置信息,我们的RabbitMQ信息存在Nacos的配置中⼼,就出现项⽬启动⽆法获取到RabbitMQ的配置,导致出错
如何解决
问题原因
中对LogBack的描述中我们可以知道,项⽬启动时,logback.xml或者logback-spring.xml加载早于applicaton.yml,所以我们在logback.xml中配置的RabbitMQ属性⽆法获取到
source指定的是application.yml配置⽂件的key
解决⽅案
将logback.xml或者logback-spring.xml⽂件⾃定义名称,并在配置中⼼中指定该⽂件,这样SpringBoot就不会在获取配置中⼼配置之前加载⽇志配置了配置中⼼的配置
#RabbitMQ配置spring:
rabbitmq:
host: 127.0.0.1 virtual-host: test username: admin password: 123logging:
config: classpath:logback-test.xml
⽇志配置
logback-test.xml
value=\"%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%method,%line] - %msg%n\" />:ss} %-5level ${springAppName:-} %thread %logger %msg%n\"/> ${log.pattern} UTF-8
${log.path}/${app_name}.log ${log.path}/${app_name}.%d{yyyy-MM-dd}.%i.log 10
10MB
true ${log.pattern} UTF-8
INFO ACCEPT
DENY
{\"appName\":\"${app_name}\
\"appInstance\":\"${app_instance_id}\
\"date\":\"%d{yyyy-MM-dd HH:mm:ss.SSS}\ \"thread\":\"[%thread]\ \"level\":\"%-5level\
\"logger\":\"%logger{36}\ \"msg\":\"%msg\" }
${rabbitmq_host} 5672
${rabbitmq_username} ${rabbitmq_password} ${rabbitmq_vhost} false direct
logs.direct logback true false UTF-8
NON_PERSISTENT infoACCEPT DENY
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。