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