溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

springboot logback怎么從apollo配置中心讀取變量

發(fā)布時(shí)間:2021-08-30 14:18:52 來(lái)源:億速云 閱讀:337 作者:小新 欄目:開(kāi)發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)springboot logback怎么從apollo配置中心讀取變量的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

springboot logback 從apollo配置中心讀取變量

1、在apollo配置中心添加

logback-config.properties配置文件

springboot logback怎么從apollo配置中心讀取變量

2、項(xiàng)目的application.yml配置文件配置如下

主要是eagerLoad.enabled: true這個(gè)配置

app:
  id: SX-sale-app-soa
apollo:
  bootstrap:
    enabled: true
    #將Apollo配置加載提到初始化日志系統(tǒng)之前
    eagerLoad:
      enabled: true
    namespaces: application.yml,logback-config

3、在logback.xml配置springProperty標(biāo)簽

設(shè)置好標(biāo)簽名稱(chēng)和配置中心變量名稱(chēng)的,使用的時(shí)候${name}引入該變量

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級(jí)別從低到高分為T(mén)RACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會(huì)輸出 -->
<!-- scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true -->
<!-- scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。 -->
<!-- debug:當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
 
	<!-- 讀取apollo配置中心設(shè)置的變量 -->
	<springProperty scope="context" name="logstash.host" source="logstash.host"></springProperty>
	<springProperty scope="context" name="logstash.port" source="logstash.port"></springProperty>
	<springProperty scope="context" name="log.path" source="log.path"></springProperty>
	
	<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <remoteHost>${logstash.host}</remoteHost>
        <port>${logstash.port}</port>
        <!-- encoder必須配置,有多種可選 -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
            <!-- "appname":"yang_test" 的作用是指定創(chuàng)建索引的名字時(shí)用,并且在生成的文檔中會(huì)多了這個(gè)字段  -->
            <customFields>{"appname":"server-user"}</customFields>
        </encoder>
    </appender>

這個(gè)是后啟動(dòng)日志中會(huì)報(bào)如下錯(cuò)誤:

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]]

這是因?yàn)槿罩疚募拿Q(chēng)是logback.xml的話(huà),logback會(huì)在SpringCloud和apollo配置加載之前加載日志配置,這時(shí)日志文件中的springProfile的配置是無(wú)效的。所以根據(jù)官方文檔說(shuō)明,需要將logback.xml改為logback-spring.xml,然后報(bào)錯(cuò)就沒(méi)有了。

注:雖然logback.xml文件名啟動(dòng)時(shí)會(huì)報(bào)錯(cuò),但是不影響實(shí)際效果,猜測(cè)是因?yàn)樯线叺诙街械呐渲脮?huì)在后邊再次加載logback日志,所以logback依然會(huì)產(chǎn)生效果,但是對(duì)于有代碼潔癖的人來(lái)說(shuō),沒(méi)有任何報(bào)錯(cuò)和異常才是最舒服的。

SpringBoot Logback無(wú)法獲取配置中心屬性

最近在做項(xiàng)目中,需要把項(xiàng)目中的日志信息通過(guò)RabbitMQ將規(guī)定格式的消息發(fā)送到消息隊(duì)列中,然后ELK系統(tǒng)通過(guò)消息隊(duì)列拿日志并且保存起來(lái),在日志的配置文件(logback-spring.xml)中我們需要加入RabbitMQ的配置信息,我們的RabbitMQ信息存在Nacos的配置中心,就出現(xiàn)項(xiàng)目啟動(dòng)無(wú)法獲取到RabbitMQ的配置,導(dǎo)致出錯(cuò)

如何解決

問(wèn)題原因

在springboot官網(wǎng) https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/

中對(duì)LogBack的描述中我們可以知道,項(xiàng)目啟動(dòng)時(shí),logback.xml或者logback-spring.xml加載早于applicaton.yml,所以我們?cè)趌ogback.xml中配置的RabbitMQ屬性無(wú)法獲取到

springboot logback怎么從apollo配置中心讀取變量

springboot logback怎么從apollo配置中心讀取變量

springboot logback怎么從apollo配置中心讀取變量

<property name="rabbitmq_host" source="spring.rabbitmq.host"/>
<property name="rabbitmq_vhost" source="spring.rabbitmq.virtual-host"/>
<property name="rabbitmq_username" source="spring.rabbitmq.username"/>
<property name="rabbitmq_password" source="spring.rabbitmq.password"/>

source指定的是application.yml配置文件的key

解決方案

將logback.xml或者logback-spring.xml文件自定義名稱(chēng),并在配置中心中指定該文件,這樣SpringBoot就不會(huì)在獲取配置中心配置之前加載日志配置了

配置中心的配置

#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"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 日志存放路徑 -->
   <property name="log.path" value="./target/logs/system-service" />
    <!-- 參數(shù) -->
    <property name="app_name" source="spring.application.name"/>
    <property name="app_instance_id" source="rabbitmq.instance"/>
    <property name="rabbitmq_host" source="spring.rabbitmq.host"/>
    <property name="rabbitmq_vhost" source="spring.rabbitmq.virtual-host"/>
    <property name="rabbitmq_username" source="spring.rabbitmq.username"/>
    <property name="rabbitmq_password" source="spring.rabbitmq.password"/>
   <!-- 日志輸出格式 -->
   <property name="log.pattern"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - [%method,%line] - %msg%n" />:ss} %-5level ${springAppName:-} %thread %logger %msg%n"/>
    <!-- 控制臺(tái)輸出 -->
   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
      </encoder>
   </appender>
    <!-- 系統(tǒng)日志輸出 -->
   <appender name="FIFE" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${log.path}/${app_name}.log</file>
        <!-- 循環(huán)政策:基于時(shí)間創(chuàng)建日志文件 -->
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
         <fileNamePattern>${log.path}/${app_name}.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
         <!-- 日志最大的歷史 60天 -->
         <maxHistory>10</maxHistory>
            <maxFileSize>10MB</maxFileSize>
      </rollingPolicy>
        <append>true</append>
      <encoder>
         <pattern>${log.pattern}</pattern>
            <charset>UTF-8</charset>
      </encoder>
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過(guò)濾的級(jí)別 -->
            <level>INFO</level>
            <!-- 匹配時(shí)的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配時(shí)的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
   </appender>
    <!-- 日志發(fā)送到消息隊(duì)列RabbitMQ,接入ELK -->
    <appender name="RabbitMQ" class="org.springframework.amqp.rabbit.logback.AmqpAppender">
        <!-- 純文本,不是格式化的JSON -->
        <layout>
            <pattern>
                {
                    "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"
                }
            </pattern>
        </layout>
        <host>${rabbitmq_host}</host>
        <port>5672</port>
        <username>${rabbitmq_username}</username>
        <password>${rabbitmq_password}</password>
        <virtualHost>${rabbitmq_vhost}</virtualHost>
        <declareExchange>false</declareExchange>
        <exchangeType>direct</exchangeType>
        <exchangeName>logs.direct</exchangeName>
        <routingKeyPattern>logback</routingKeyPattern>
        <generateId>true</generateId>
        <durable>false</durable>
        <charset>UTF-8</charset>
        <deliveryModel>NON_PERSISTENT</deliveryModel>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
   <!--系統(tǒng)操作日志-->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILE" />
        <appender-ref ref="RabbitMQ" />
    </root>
</configuration>

感謝各位的閱讀!關(guān)于“springboot logback怎么從apollo配置中心讀取變量”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI