logback多环境配置

时间:2021-02-03 08:31:42

现在项目基本都是要区分测试开发等等一系列环境的,也因此maven,spring之类的都具有profile这类功能,可以针对不同的环境采用不同的配置.因此日志也可能根据不同的环境需要不同的配置.恰巧手头上碰到了这么一个需求,日志文件也需要区分环境,便搜索了一下相关的资料,发现logback的确也提供这么一种支持.

从logback官网的文档中找到一段关于<if>标签的配置说明,它提供一种根据表达式的值来决定是否输出配置的功能,类似于c标签中的if,官网的示例如下:

<!-- if-then form -->
<if condition="some conditional expression">
<then>
...
</then>
</if> <!-- if-then-else form -->
<if condition="some conditional expression">
<then>
...
</then>
<else>
...
</else>
</if>

这个<if>标签可以使用在日志配置文件中的<configuration>标签内部任意位置,一种简单的使用实例如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property resource="config.properties" />
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%date [%thread] %-5level - %msg%n</pattern>
</encoder>
</appender>
<if condition='property("logstash").contains("true")'>
<then>
<appender name="logStash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${logstash.address}</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder" />
<keepAliveDuration>15 minutes</keepAliveDuration>
</appender>
</then>
</if>
<root level="ERROR">
<appender-ref ref="stdout"/>
<if condition='property("logstash").contains("true")'>
<then>
<appender-ref ref="logStash"/>
</then>
</if>
</root>
</configuration>

这种标签只支持从property中取值,或是从system系统property中取值,取出的为string类型的值,可以通过contains方法判断是否满足某个条件.

特别说明:这个是通过Janino库实现的,故需要加入此库的依赖.

<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.6</version>
</dependency>