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



    作者:zeng1994
    出处:http://www.cnblogs.com/zeng1994/
    本文版权归作者和博客园共有,欢迎转载!但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!

  • 相关阅读:
    VS2010中添加MVC3和MVC4
    C#--对象转成XML的方法
    Web优化的措施
    Socket的使用(简单测试)
    WCF、WebAPI、WCFREST、WebService之间的区别
    Java和C#(笔记)
    各种窗口最小化快捷键详解
    SASS的安装及使用(前提:安装Ruby)
    查看Linux是32位还是64位
    log4j输出日志到文件
  • 原文地址:https://www.cnblogs.com/zeng1994/p/22d5cdebe5f165456ce4a01a7a19819a.html
Copyright © 2020-2023  润新知