這篇文章給大家分享的是有關springboot logback怎么從apollo配置中心讀取變量的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
logback-config.properties配置文件

主要是eagerLoad.enabled: true這個配置
app: id: SX-sale-app-soa apollo: bootstrap: enabled: true #將Apollo配置加載提到初始化日志系統之前 eagerLoad: enabled: true namespaces: application.yml,logback-config
設置好標簽名稱和配置中心變量名稱的,使用的時候${name}引入該變量
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低于WARN的信息都不會輸出 -->
<!-- scan:當此屬性設置為true時,配置文件如果發生改變,將會被重新加載,默認值為true -->
<!-- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 -->
<!-- debug:當此屬性設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。默認值為false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!-- 讀取apollo配置中心設置的變量 -->
<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" 的作用是指定創建索引的名字時用,并且在生成的文檔中會多了這個字段 -->
<customFields>{"appname":"server-user"}</customFields>
</encoder>
</appender>這個是后啟動日志中會報如下錯誤:
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依然會產生效果,但是對于有代碼潔癖的人來說,沒有任何報錯和異常才是最舒服的。
最近在做項目中,需要把項目中的日志信息通過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屬性無法獲取到



<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文件自定義名稱,并在配置中心中指定該文件,這樣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"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路徑 -->
<property name="log.path" value="./target/logs/system-service" />
<!-- 參數 -->
<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"/>
<!-- 控制臺輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 系統日志輸出 -->
<appender name="FIFE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/${app_name}.log</file>
<!-- 循環政策:基于時間創建日志文件 -->
<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">
<!-- 過濾的級別 -->
<level>INFO</level>
<!-- 匹配時的操作:接收(記錄) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配時的操作:拒絕(不記錄) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 日志發送到消息隊列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>
<!--系統操作日志-->
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="RabbitMQ" />
</root>
</configuration>感謝各位的閱讀!關于“springboot logback怎么從apollo配置中心讀取變量”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。