SpringBoot Logback无法获取配置中心属性
SpringBoot Logback无法获取配置中心属性
前言
最近在做项目中,需要把项目中的日志信息通过RabbitMQ将规定格式的消息发送到消息队列中,然后ELK系统通过消息队列拿日志并且保存起来,在日志的配置文件(logback-spring.xml)中我们需要加入RabbitMQ的配置信息,我们的RabbitMQ信息存在Nacos的配置中心,就出现项目启动无法获取到RabbitMQ的配置,导致出错
如何解决
问题原因
在springboot官网 https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/#boot-features-logging
中对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: 123
logging:
config: classpath:logback-test.xml
日志配置
logback-test.xml
<?xml version="1.0" encoding="UTF-8"?>
: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
info
ACCEPT
DENY