springboot logback如何從apollo配置中心讀取變量
springboot logback 從apollo配置中心讀取變量
1、在apollo配置中心添加
logback-config.properties配置文件
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)簽名稱和配置中心變量名稱的,使用的時(shí)候${name}引入該變量
<?xml version="1.0" encoding="UTF-8"?> <!-- 日志級(jí)別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會(huì)輸出 --> <!-- scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true --> <!-- scanPeriod:設(shè)置監(jiān)測配置文件是否有修改的時(shí)間間隔,如果沒有給出時(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是logback.xml的話,logback會(huì)在SpringCloud和apollo配置加載之前加載日志配置,這時(shí)日志文件中的springProfile的配置是無效的。所以根據(jù)官方文檔說明,需要將logback.xml改為logback-spring.xml,然后報(bào)錯(cuò)就沒有了。
注:雖然logback.xml文件名啟動(dòng)時(shí)會(huì)報(bào)錯(cuò),但是不影響實(shí)際效果,猜測是因?yàn)樯线叺诙街械呐渲脮?huì)在后邊再次加載logback日志,所以logback依然會(huì)產(chǎn)生效果,但是對于有代碼潔癖的人來說,沒有任何報(bào)錯(cuò)和異常才是最舒服的。
SpringBoot Logback無法獲取配置中心屬性
最近在做項(xiàng)目中,需要把項(xiàng)目中的日志信息通過RabbitMQ將規(guī)定格式的消息發(fā)送到消息隊(duì)列中,然后ELK系統(tǒng)通過消息隊(duì)列拿日志并且保存起來,在日志的配置文件(logback-spring.xml)中我們需要加入RabbitMQ的配置信息,我們的RabbitMQ信息存在Nacos的配置中心,就出現(xiàn)項(xiàng)目啟動(dòng)無法獲取到RabbitMQ的配置,導(dǎo)致出錯(cuò)
如何解決
問題原因
在springboot官網(wǎng) https://docs.spring.io/spring-boot/docs/2.0.4.RELEASE/reference/htmlsingle/
中對LogBack的描述中我們可以知道,項(xiàng)目啟動(dòng)時(shí),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就不會(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"> <!-- 過濾的級(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>
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JavaCV實(shí)現(xiàn)多個(gè)MP4視頻的合并
這篇文章主要為大家詳細(xì)介紹了如何使用javacv和ffmpeg框架實(shí)現(xiàn)簡單快速的合并mp4文件的視頻和音頻,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-10-10Java微信二次開發(fā)(三) Java微信各類型消息封裝
這篇文章主要為大家詳細(xì)介紹了Java微信二次開發(fā)第三篇,Java微信各類型消息封裝,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04Java中的HttpServletRequestWrapper用法解析
這篇文章主要介紹了Java中的HttpServletRequestWrapper用法解析,HttpServletRequest 對參數(shù)值的獲取實(shí)際調(diào)的是org.apache.catalina.connector.Request,沒有提供對應(yīng)的set方法修改屬性,所以不能對前端傳來的參數(shù)進(jìn)行修改,需要的朋友可以參考下2024-01-01log4j2 RollingRandomAccessFile配置過程
這篇文章主要介紹了log4j2 RollingRandomAccessFile配置過程,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07java通過jacob實(shí)現(xiàn)office在線預(yù)覽功能
這篇文章主要為大家詳細(xì)介紹了java通過jacob實(shí)現(xiàn)office在線預(yù)覽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08