logback日誌使用if...else邏輯判斷 一、引入依賴 二、條件表達式 三、簡單案例

在項目中,存在使用條件判斷的場景,例如想爲測試和生產設置不同的日誌記錄級別。幸好的是,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標籤。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章