SpringBoot Logback 實現輸出到Logstash或文件的動態切換


    開發過程中,日志一般都是直接輸出到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)參數值傳遞流轉圖




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM