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)参数值传递流转图
![](https://img2020.cnblogs.com/blog/1222688/202110/1222688-20211026234350164-786568303.png)
作者:zeng1994
出处:http://www.cnblogs.com/zeng1994/
本文版权归作者和博客园共有,欢迎转载!但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!