java日誌(三)–slf4j和logback使用

java日誌(三)–slf4j和logback使用

一、簡介

這裏介紹slf4j和logback,及其組合使用。

二、slf4j知識點

slf4j是日誌接口。

2.1 官網地址

https://www.slf4j.org/

2.2 主要jar包

slf4j-api:slf4j的核心包,只有接口,沒實現;
slf4j-log4j:slf4j與log4j整合的橋接包(使用中還得添加日誌實現包log4j);
slf4j-jdk14:slf4j與jul(java.util.logging)整合的橋接包;
slf4j-simple:slf4j的簡單實現;

2.3 日誌級別

slf4j的日誌級別有5類,分別是ERROR, WARN, INFO, DEBUG, TRACE。
源碼如下:

ERROR(ERROR_INT, "ERROR"), WARN(WARN_INT, "WARN"), INFO(INFO_INT, "INFO"), DEBUG(DEBUG_INT, "DEBUG"), TRACE(TRACE_INT, "TRACE");
final public int TRACE_INT = 00;
final public int DEBUG_INT = 10;
final public int INFO_INT = 20;
final public int WARN_INT = 30;
final public int ERROR_INT = 40;

2.4 核心接口或類

org.slf4j.Logger:核心接口(包含了日誌操作的方法);
org.slf4j.LoggerFactory:工廠類,獲取日誌實例;

三、logback知識點

logback是對slf4j的官方實現,出自同一人之手,不需要橋接包。

3.1 官網地址

https://logback.qos.ch/manual/index.html

3.2 主要jar包

logback-core:基礎包,其它的jar包以此爲基礎;
logback-classic:slf4j接口的實現;
logback-classic:與servlet(servlet容器如tomcat、jetty)集成,提供http訪問日誌功能;

3.3 配置文件

logback的配置文件位src/main/resources目錄下。
其加載順序爲(優先級從高到低):logback.groovy --> logback-test.xml --> logback.xml

四、logback配置文件結構

logback.xml配置文件根結點爲configuration,內主要包含property、contextName、appender、filter、pattern、logger、root等結點。

4.1 configuration根結點

configuration主要有三個屬性,debug、 scan、scanPeriod,示例及解釋如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--debug:是否輸出logback運行日誌,true則始終輸出,false則出錯時才輸出;
    scan:文件修改時是否怎麼加載,true則自動加載,false則不自動加載;
    scanPeriod:掃描自動加載間隔,單位有milliseconds、seconds、munites、hours,默認爲milliseconds; -->
<configuration debug="ture" scan="true" scanPeriod="60 seconds">
</configuration>    

4.2 property屬性結點

變量定義,如:

<!--定義變量-->
<property name="logName" value="logbackStudy" />
<!--從src/main/resources加載配置文件(文件內key=val形式每行一個),配置文件中的值可直接使用-->
<property resource="logback.properties" />

4.3 timestamp時間結點

獲取當前日期時間並格式化,如:

<timestamp key="nowDate" datePattern="yyyyMMdd" />
<timestamp key="nowDateTime" datePattern="yyyyMMdd_HHmmss" />

4.4 contextName 上下文名稱結點

日誌上下文名稱,如:

<!--當前logger上下文名稱-->
<contextName>${logName}</contextName>

4.5 appender日誌輸出結點

日誌輸出目的,有ConsoleAppender(輸出到控制檯)、FileAppender(輸出到文件)、SMTPAppender(輸出到郵件)、DBAppender(輸出到數據庫)、AsyncAppender(異步輸出,包裝其它具體的appender,不單獨使用)等。
官方文檔爲:https://logback.qos.ch/manual/appenders.html

4.5.1 ConsoleAppender

輸出到控制檯,如:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%date %highlight(%-5level) %logger : %msg %n</pattern>
    </encoder>
</appender>
4.5.2 FileAppender

輸出到文件,包含file結點(文件名)、rollingPolicy(歷史日誌歸檔),下面按時間歸檔如:

<timestamp key="nowDate" datePattern="yyyyMMdd" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>logbackStudy.log</file>
    <!--<file>logbackStudy_${nowDate}.log</file>-->
    <!--<file>${nowDate}/logbackStudy.log</file>-->

    <!--日誌滾動的策略,按時間歸檔,實現了RollingPolicy和TriggeringPolicy接口,RollingPolicy指歷史文件歸檔策略,TriggeringPolicy指歷史文件歸檔時機-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>logbackStudy_%d{yyyyMMdd}.log.gz</fileNamePattern>
        <!--最多保存30天曆史-->
        <maxHistory>30</maxHistory>
        <!--日誌文件合起來最大1G,超出後會刪除舊日誌-->
        <totalSizeCap>1G</totalSizeCap>
    </rollingPolicy>
    <encoder>
        <!--日誌模板-->
        <pattern>%date %level %logger : %msg %n</pattern>
    </encoder>
</appender>

另外按文件大小歸檔示例如下:

<!--日誌滾動的策略,按文件大小歸檔,實現了RollingPolicy和TriggeringPolicy接口,RollingPolicy指歷史文件歸檔策略,TriggeringPolicy指歷史文件歸檔時機-->
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <!--%i是當文件大小超過maxFileSize大小時,則用下標新建文件,.gz或.zip後綴會自動壓縮-->
    <fileNamePattern>logbackStudy_%i.log.gz</fileNamePattern>
    <!--%i的取值範圍-->
    <minIndex>1</minIndex>
    <minIndex>5</minIndex>
</rollingPolicy>
<!--觸發歸檔-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <!--文件達到10MB時就歸檔-->
    <maxFileSize>10MB</maxFileSize>
</triggeringPolicy>

同時按時間和文件大小示例如下:

<!--日誌滾動的策略,按時間和文件大小歸檔,實現了RollingPolicy和TriggeringPolicy接口,RollingPolicy指歷史文件歸檔策略,TriggeringPolicy指歷史文件歸檔時機-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
    <!--%i是當文件大小超過maxFileSize大小時,則用下標新建文件,.gz或.zip後綴會自動壓縮-->
    <!--<fileNamePattern>logbackStudy_%d{yyyyMMdd}_%i.log</fileNamePattern>-->
    <fileNamePattern>logbackStudy_%d{yyyyMMdd}_%i.log.gz</fileNamePattern>
    <!--文件最大100MB-->
    <maxFileSize>100MB</maxFileSize>
    <!--最多保存30天曆史-->
    <maxHistory>30</maxHistory>
    <!--日誌文件合起來最大1G,超出後會刪除舊日誌-->
    <totalSizeCap>1G</totalSizeCap>
</rollingPolicy>
4.5.3 AsyncAppender

異步添加日誌,不單獨使用,一般通過引用其它具體的appender來使用。如:

<!--異步記錄日誌,需引用其它的appender-->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
</appender>

除了上述appender外,另外還有SocketAppender(輸出到socket)、SMTPAppender(輸出到郵件)、
DBAppender(輸出到數據庫)等。在此不一一列出,具體請在使用再次查找相關文檔。

4.6 filter過濾器結點

filter是日誌過濾器,官網地址:https://logback.qos.ch/manual/filters.html,通過實現ch.qos.logback.core.filter.Filter接口可以自定義過濾器,示例如下:
自定義過濾器類LogbackUrlFilter.class

import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;

public class LogbackUrlFilter extends Filter<ILoggingEvent> {
    @Override
    public FilterReply decide(ILoggingEvent event) {
        if(event.getMessage().contains("url")){
            return FilterReply.ACCEPT;
        }
        return FilterReply.DENY;
    }
}

配置如下:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!--自定義過濾器-->
    <filter class="com.dragon.study.log.LogbackUrlFilter" />
    <encoder>
        <pattern>%date %level %logger : %msg %n</pattern>
    </encoder>
</appender>

另外過濾器還可以來自自帶的或表達式直接寫在配置文件中,如下:

<!--日誌級別(針對具體指定級別)過濾器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>NEUTRAL</onMismatch>
    <!--<onMismatch>DENY</onMismatch>-->
</filter>

<!--日誌級別(針對指定級別及以上級別)過濾器-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    <!--<level>INFO</level>-->
    <level>WARN</level>
</filter>

<!--根據判斷條件的過慮器-->
<filter class ="ch.qos.logback.core.filter.EvaluatorFilter">
    <evaluator >
        <!--expression爲java代碼,需要添加groupId爲org.codehaus.janino,artifactId爲janino的maven包-->
        <expression>
            //根據logger名稱判斷
            if(logger.equals("Slf4jAndLogbackMain"){
            return true;
            }
            //根據返回值判斷
            if(event.getStatusCode()==200){
            return true;
            }
            //根據日誌消息判斷
            if(message.contains("url")){
            return true;
            }
            return false;
        </expression>
    </evaluator>
    <onMatch>ACCEPT</onMatch>
    <onMismatch>DENY</onMismatch>
</filter>

4.7 pattern日誌格式

定義每行日誌記錄的格式,官網地址:https://logback.qos.ch/manual/layouts.html ,
常用變量別名(包括全稱和簡稱)有:

變量名
%logger(簡寫:%c或%lo): 當前日誌名稱,如: Slf4jAndLogbackMain
%class(簡寫:%C): 日誌調用所在類,如: com.dragon.study.log.Slf4jAndLogbackMain
%method(簡寫:%M): 日誌所在方法,如: main
%caller: 日誌調用位置,如:at com.dragon.study.log.Slf4jAndLogbackMain.main(Slf4jAndLogbackMain.java:15)
%thread(簡寫:%t): 日誌調用所有線程序,如:main
%level(簡寫:%p或%le): 日誌級別,如:INFO
%date(簡寫:%d): 日期,如: 2018-12-15 21:40:12,890
%msg(簡寫:%m): 日誌記錄內容
%exception(簡寫:%ex): 異常記錄

寬度設置
%20logger:當字符數少於20個字符時,則左側留空白;
%-20logger:當字符數少於20個字符時,則右側留空白;
%.30logger:當字符數據大於30個時,則截斷;

顯示設置
%highligth:突出顯示
%green(%red、%blue、%white):字體顯示爲指定顏色
{length}可指定長度,如%logger{36}

網絡訪問設置(依賴logger-access包)
%remoteIP(簡寫:%a):遠程ip;
%localIP(簡寫:%A):本地ip;
%clientHost(簡寫:%h):遠程主機名;
%localPort:本地端口;
%requestMethod(簡寫:%m):http請求方法;
%protocol(簡寫:%H):http請求協議;
%statusCode(簡寫:%s):http請求status code;
%requestURL(簡寫:%r):http請求地址;
%requestURI(簡寫:%U):http請求資源地址;
%queryString(簡寫:%q):http請求參數;
%server(簡寫:%v):服務器地址;
%elapsedTime(簡寫:%D):http請求處理的時間,單位是毫秒;
%elapsedSeconds(簡寫:%T):http請求處理的時間,單位是秒;
%date(簡寫:%t):日誌記錄時間;
%threadName(簡寫:%I):處理請求的線程名;
%reqAttribute{attributeName}:http請求attribute值;
%reqCookie{cookie}:http請求cookie值;
%reqContent:http請求體內容;
%fullRequest:http完整請求;
%responseContent:http響應;
%fullResponse:http完整響應;

示例如:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <encoder>
            <!--全稱形式-->
            <pattern>%date %logger %class %method %highlight(%level) %thread  : %msg%n</pattern>
            <!--簡寫形式-->
            <!--<pattern>%d %lo %C %M %le %t %le %lo : %m%n</pattern>-->
        </encoder>
    </encoder>
</appender>

4.8 logger結點

設置某一包或類下的日誌打印級別、appender。

<!--控制指定包或類的日誌輸出(包括等級和目的地), additivity表示日誌信息是否向上傳遞,false爲不傳遞(即不重複打印)-->
<logger name="com.dragon.study.log.Slf4jAndLogbackMainTwo" level="warn" additivity="false">
    <!--可多個appender-->
    <appender-ref ref="STDOUT" />
</logger>

4.9 root結點

指定日誌級別及輸出的appender,如:

<root level="info">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE" />
</root>

至此,logback關鍵結點介紹完畢。

五、slf4j和logback組合使用示例

5.1 添加maven依賴

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.11</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.11</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.8</version>
</dependency>
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
    <version>3.0.7</version>
</dependency>

5.2 logback配置文件編寫

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--當前logger上下文名稱-->
    <contextName>logbackStudy</contextName>

    <!--當前日期-->
    <timestamp key="nowDate" datePattern="yyyyMMdd" />

    <!--輸出到控制檯-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%date %level %logger : %msg %n</pattern>
        </encoder>
    </appender>

    <!--輸出到文件-->
    <appender name="FILE" class="ch.qos.logback.core.FileAppender">
        <file>logbackstudy_${nowDate}.log</file>

        <!--日誌滾動的策略,按時間歸檔,實現了RollingPolicy和TriggeringPolicy接口,RollingPolicy指歷史文件歸檔策略,TriggeringPolicy指歷史文件歸檔時機-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>logbackStudy_%d{yyyyMMdd}.log.gz</fileNamePattern>
            <!--最多保存30天曆史-->
            <maxHistory>30</maxHistory>
            <!--日誌文件合起來最大1G,超出後會刪除舊日誌-->
            <totalSizeCap>1G</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <!--日誌模板-->
            <pattern>%date %level %logger : %msg %n</pattern>
        </encoder>
    </appender>

    <!--控制指定包或類的日誌輸出(包括等級和目的地), additivity表示日誌信息是否向上傳遞,false爲不傳遞(即不重複打印)-->
    <logger name="com.dragon.study.log.Slf4jAndLogbackMainTwo" level="warn" additivity="false">
        <!--可多個appender-->
        <appender-ref ref="STDOUT" />
    </logger>

    <root level="info">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

4.3 測試

Slf4jAndLogbackMainTwo.class和Slf4jAndLogbackMain.class完全一樣

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Slf4jAndLogbackMain {
    public static final Logger logger = LoggerFactory.getLogger(Slf4jAndLogbackMain.class);
    public static void main(String[] args) throws InterruptedException {
        logger.trace("trace log with param, {} {}", "p1", "p2");
        logger.debug("debug log");
        logger.info("info log");
        logger.warn("warn log");
        logger.error("error log");
        logger.info("url info log");
    }
}

結果:
生成logbackstudy_20181219.log文件並輸出:

2018-12-19 00:11:34,922 INFO com.dragon.study.log.Slf4jAndLogbackMain : info log 
2018-12-19 00:11:34,939 WARN com.dragon.study.log.Slf4jAndLogbackMain : warn log 
2018-12-19 00:11:34,939 ERROR com.dragon.study.log.Slf4jAndLogbackMain : error log 
2018-12-19 00:11:34,940 INFO com.dragon.study.log.Slf4jAndLogbackMain : url info log 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章