在項目中,存在使用條件判斷的場景,例如想爲測試和生產設置不同的日誌記錄級別。幸好的是,logback本身已經支持這種場景。
一、引入依賴
<dependency>
<groupId>org.codehaus.janino</groupId>
<artifactId>janino</artifactId>
<version>3.0.6</version>
</dependency>
二、條件表達式
2.1 語法
if-then語法:
<if condition="some conditional expression">
<then>
...
</then>
</if>
if-then-else語法:
<if condition="some conditional expression">
<then>
...
</then>
<else>
...
</else>
</if>
2.2 條件表達式
2.2.1 Using property() or p()
只能訪問上下文屬性或者系統屬性。對於作爲參數傳遞的鍵,property()
或p()
方法返回屬性的String的值。
property("someKey").contains("someValue")
或者
p("someKey").contains("someValue")
2.2.2 Using isDefined()
用來檢查屬性是否定義
isDefined("someKey")
2.2.3 Using isNull()
用來檢查屬性是否爲空
isNull("someKey")
三、簡單案例
2.2中條件表達式如何讀取變量的值,下面介紹兩種方案:
3.1 方式一:讀取上下文變量的值
需要配置springProperty
標籤,即配置上下文變量。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--注意點:獲取上下文變量的值-->
<springProperty scope="context" name="PV_LOG" source="my.pvlog"/>
<contextName>logback</contextName>
<!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
<property name="log.path" value="/Users/libai/Documents/log"/>
<!--輸出到控制檯-->
<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:級別從左顯示5個字符寬度 %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:級別從左顯示5個字符寬度 %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:級別從左顯示5個字符寬度 %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 方式二:讀取系統變量的值
這一種方案就是讀取JVM啓動的值。無需配置springProperty
標籤。