logback多环境配置

现在项目基本都是要区分测试开发等等一系列环境的,也因此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>

 

posted on 2018-01-20 22:58  蓝萝卜blu  阅读(1605)  评论(0编辑  收藏  举报

导航