在項(xiàng)目中却音,存在使用條件判斷的場(chǎng)景,例如想為測(cè)試和生產(chǎn)設(shè)置不同的日志記錄級(jí)別矢炼。幸好的是系瓢,logback本身已經(jīng)支持這種場(chǎng)景。
一句灌、引入依賴
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.6</version>
</dependency>
二夷陋、條件表達(dá)式
2.1 語(yǔ)法
if-then語(yǔ)法:
<if condition="some conditional expression">
<then>
...
</then>
</if>
if-then-else語(yǔ)法:
<if condition="some conditional expression">
<then>
...
</then>
<else>
...
</else>
</if>
2.2 條件表達(dá)式
2.2.1 Using property() or p()
只能訪問(wèn)上下文屬性或者系統(tǒng)屬性欠拾。對(duì)于作為參數(shù)傳遞的鍵,property()
或p()
方法返回屬性的String的值骗绕。
property("someKey").contains("someValue")
或者
p("someKey").contains("someValue")
2.2.2 Using isDefined()
用來(lái)檢查屬性是否定義
isDefined("someKey")
2.2.3 Using isNull()
用來(lái)檢查屬性是否為空
isNull("someKey")
三藐窄、簡(jiǎn)單案例
2.2中條件表達(dá)式如何讀取變量的值,下面介紹兩種方案:
3.1 方式一:讀取上下文變量的值
需要配置springProperty
標(biāo)簽酬土,即配置上下文變量荆忍。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--注意點(diǎn):獲取上下文變量的值-->
<springProperty scope="context" name="PV_LOG" source="my.pvlog"/>
<contextName>logback</contextName>
<!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對(duì)路徑-->
<property name="log.path" value="/Users/libai/Documents/log"/>
<!--輸出到控制臺(tái)-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<encoder>
<!--<pattern>%d %p (%file:%line\)- %m%n</pattern>-->
<!--格式化輸出:%d:表示日期 %thread:表示線程名 %-5level:級(jí)別從左顯示5個(gè)字符寬度 %msg:日志消息 %n:是換行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--輸出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/main.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>main.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--格式化輸出:%d:表示日期 %thread:表示線程名 %-5level:級(jí)別從左顯示5個(gè)字符寬度 %msg:日志消息 %n:是換行符-->
<pattern>文件記錄-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--條件判斷-->
<if condition='property("PV_LOG").equals("true")'>
<then>
<appender name="logAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/pv.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>pv.%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--格式化輸出:%d:表示日期 %thread:表示線程名 %-5level:級(jí)別從左顯示5個(gè)字符寬度 %msg:日志消息 %n:是換行符-->
<pattern>文件記錄-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 輸出攔截器的pv日志-->
<logger name="com.tellme.interceptor.PvLogInterceptor" level="info" additivity="false">
<appender-ref ref="logAppender"/>
</logger>
</then>
</if>
</configuration>
在application.yml
的配置如下:
my:
pvlog: true
3.2 方式二:讀取系統(tǒng)變量的值
這一種方案就是讀取JVM啟動(dòng)的值。無(wú)需配置springProperty
標(biāo)簽撤缴。