springboot logback如何从apollo配置中心读取变量

springboot logback 从apollo配置中心读取变量

1、在apollo配置中心添加

logback-config.properties配置文件

springboot logback如何从apollo配置中心读取变量_第1张图片

2、项目的application.yml配置文件配置如下

主要是eagerLoad.enabled: true这个配置

app:
  id: SX-sale-app-soa
apollo:
  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的配置,导致出错

如何解决

问题原因

在springboot官网 https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/

中对LogBack的描述中我们可以知道,项目启动时,logback.xml或者logback-spring.xml加载早于applicaton.yml,所以我们在logback.xml中配置的RabbitMQ属性无法获取到

springboot logback如何从apollo配置中心读取变量_第2张图片

springboot logback如何从apollo配置中心读取变量_第3张图片

springboot logback如何从apollo配置中心读取变量_第4张图片




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



    
   
    
    
    
    
    
    
    
   
   :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
        
    
   
    
        
        
        
    

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

你可能感兴趣的:(springboot logback如何从apollo配置中心读取变量)