開發過程中,日志一般都是直接輸出到logstash,不過這都是幾年前的玩法了。生產環境一般都是通過Filebeat去收集日志,不采用應用直連logstash的方式。為了實現快速切換,因此在項目的application.yml中添加個開關,直接通過開關切換輸出到文件還是logstash
一、實現思路
(1)application.yml添加一個開關項
(2)logback-spring.xml 中取application.yml的開關項值
(3)logback-spring.xml 對 開關值進行判斷,用if 標簽動態加載 <appender/> 及 <appender-ref/>
二、具體實現
(1)application.yml
# 日志打印類型,1為直連 logstash 0 為輸出到文件
elk:
logstash:
print:
enable: 1
(2) logback-spirng.xml
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!--官方配置 start-->
<!--保留官方配置,方便使用官方配置的特性,參考:spring-boot-2.1.0.RELEASE.jar!\org\springframework\boot\logging\logback\base.xml-->
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<include resource="org/springframework/boot/logging/logback/file-appender.xml"/>
<!--官方配置 end-->
<!--<springProperty name="logstashDestination" source="log.logstash.destination" defaultValue="192.168.200.50:5000"/>-->
<!--<springProperty name="idx_pre" source="elk.elasticsearch.index.prefix" defaultValue="original-api"/>-->
<!-- 取 yml中的值需要用 springProperty 來取-->
<springProperty name="logstashPrint" source="elk.logstash.print.enable" defaultValue="0"/>
<if condition='${logstashPrint} == 1'>
<then>
<!--輸出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以訪問的logstash日志收集端口-->
<destination>${logstashDestination:-192.168.200.50:5000}</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"idx_pre": "${idx_pre:-original-api}"}</customFields>
<timeZone>UTC</timeZone>
</encoder>
</appender>
</then>
<!--<else>
這里填else內容
</else>-->
</if>
<!--配置logstash-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<!--動態判斷-->
<if condition='${logstashPrint} == 1'>
<then>
<appender-ref ref="LOGSTASH"/>
</then>
<else>
<appender-ref ref="FILE"/>
</else>
</if>
</root>
</configuration>
(3)參數值傳遞流轉圖
