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)参数值传递流转图



posted @ 2021-10-26 23:44  zeng1994  阅读(1494)  评论(0编辑  收藏  举报