一、Logback的使用
Logback是由log4j創始人設計的另一個開源日志元件,性能比log4j要好。
1. Logback主要分為三個子產品
Ø logback-core:其它兩個子產品的基礎子產品
Ø logback-classic:它是log4j的一個改良版本,同時它完整實作了slf4j API
Ø logback-access:通路子產品與Servlet容器內建提供通過Http來通路日志的功能
Ø 後續的日志代碼都是通過SLF4J日志門面搭建日志系統,是以在代碼是沒有差別,主要是通過修改配置檔案和pom.xml依賴
2. logback入門
Ø 依賴
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.27</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
Ø 代碼
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo1 {
private static final Logger LOGGER = LoggerFactory.getLogger(Demo1.class);
@Test
public void test1(){
//列印日志資訊
LOGGER.error("error");
LOGGER.warn("warn");
LOGGER.info("info");
LOGGER.debug("debug");//預設級别
LOGGER.trace("trace");
}
}
輸出: |
3. logback配置
logback會依次讀取以下類型配置檔案:
1.logback.groovy
2.logback-test.xml
3.logback.xml
4.如果均不存在會采用預設配置
1》logback元件之間的關系
1. Logger:日志的記錄器,把它關聯到應用的對應的context上後,主要用于存放日志對象,也可以定義日志類型、級别。
2. Appender:用于指定日志輸出的目的地,目的地可以是控制台、檔案、資料庫等等。
3. Layout:負責把事件轉換成字元串,格式化的日志資訊的輸出。在logback中Layout對象被封裝在encoder中。
2》基本配置:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的屬性 通過 ${name} 進行引用 -->
<!--
日志輸出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c類的完整名稱
%M為method
%L為行号
%thread線程名稱
%m或者%msg為資訊
%n換行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!-- 輸出的位置:控制台輸出
Appender: 設定日志資訊的去向,常用的有以下幾個
ch.qos.logback.core.ConsoleAppender (控制台)
ch.qos.logback.core.rolling.RollingFileAppender (檔案大小到達指定尺寸的時候産生一個新檔案)
ch.qos.logback.core.FileAppender (檔案)
-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!--控制輸出流對象 預設 System.out 改為 System.err-->
<target>System.err</target>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- <root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個logger。-->
<root level="ALL">
<appender-ref ref="console"/>
</root>
</configuration>
輸出: |
3》檔案輸出:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的屬性 通過 ${name} 進行引用 -->
<!--
日志輸出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c類的完整名稱
%M為method
%L為行号
%thread線程名稱
%m或者%msg為資訊
%n換行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志檔案存放的路徑-->
<property name="log_dir" value="D://logs"></property>
<!-- 輸出的位置:檔案輸出 -->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<!--檔案儲存的路徑-->
<file>${log_dir}/logback.log</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
</appender>
<!-- <root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個logger。-->
<root level="ALL">
<appender-ref ref="file"/>
</root>
</configuration>
輸出: |
4》檔案輸出(html)
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的屬性 通過 ${name} 進行引用 -->
<!--
日志輸出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c類的完整名稱
%M為method
%L為行号
%thread線程名稱
%m或者%msg為資訊
%n換行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志檔案存放的路徑-->
<property name="log_dir" value="D://logs"></property>
<!-- 輸出的位置: html 格式日志檔案輸出-->
<appender name="file" class="ch.qos.logback.core.FileAppender">
<!--檔案儲存的路徑-->
<file>${log_dir}/logback.html</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<pattern>${pattern}</pattern>
</layout>
</encoder>
</appender>
<!-- <root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個logger。-->
<root level="ALL">
<appender-ref ref="file"/>
</root>
</configuration>
輸出: |
5》日志拆分、壓縮和過濾
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的屬性 通過 ${name} 進行引用 -->
<!--
日志輸出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c類的完整名稱
%M為method
%L為行号
%thread線程名稱
%m或者%msg為資訊
%n換行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志檔案存放的路徑-->
<property name="log_dir" value="D://logs"></property>
<!-- 輸出的位置: 日志拆分、歸檔壓縮和過濾 -->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--檔案儲存的路徑-->
<file>${log_dir}/logback.log</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--拆分規則-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照時間和壓縮格式聲明拆分的檔案名-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照檔案大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!--日志級别過濾器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--日志過濾規則-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- <root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個logger。-->
<root level="ALL">
<appender-ref ref="rollFile"/>
</root>
</configuration>
輸出: |
6》異步日志和自定義logger
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 配置集中管理的屬性 通過 ${name} 進行引用 -->
<!--
日志輸出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c類的完整名稱
%M為method
%L為行号
%thread線程名稱
%m或者%msg為資訊
%n換行
-->
<property name="pattern" value="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n"></property>
<!--日志檔案存放的路徑-->
<property name="log_dir" value="D://logs"></property>
<!-- 輸出的位置: 日志拆分、歸檔壓縮和過濾 -->
<appender name="rollFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--檔案儲存的路徑-->
<file>${log_dir}/logback.log</file>
<!--日志消息格式配置-->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${pattern}</pattern>
</encoder>
<!--拆分規則-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--按照時間和壓縮格式聲明拆分的檔案名-->
<fileNamePattern>${log_dir}/rolling.%d{yyyy-MM-dd}.log%i.gz</fileNamePattern>
<!--按照檔案大小拆分-->
<maxFileSize>1MB</maxFileSize>
</rollingPolicy>
<!--日志級别過濾器-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--日志過濾規則-->
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--異步日志-->
<appender name="async" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="rollFile"/>
</appender>
<!--root logger 配置-->
<!-- <root>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個logger。-->
<root level="ALL">
<appender-ref ref="rollFile"/>
</root>
<!---自定義logger-->
<!--
用來設定某一個包或者具體的某一個類的日志列印級别、以及指定<appender>。
<loger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性
name:
用來指定受此logger限制的某一個包或者具體的某一個類。
level:
用來設定列印級别,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,如果未設定此屬性,那麼目前logger将會繼承上級的級别。
additivity:
是否向上級loger傳遞列印資訊。預設是true。
<logger>可以包含零個或多個<appender-ref>元素,辨別這個appender将會添加到這個logger
-->
<logger name="com.hk.log.logback" level="info" additivity="false">
<appender-ref ref="rollFile"/>
</logger>
</configuration>
4. 官方提供的log4j.properties轉換成logback.xml
https://logback.qos.ch/translator/
5. logback-access的使用
logback-access子產品與Servlet容器(如Tomcat和Jetty)內建,以提供HTTP通路日志功能。我們可以使用logback-access子產品來替換tomcat的通路日志。
1. 将logback-access.jar與logback-core.jar複制到$TOMCAT_HOME/lib/目錄下
2. 修改$TOMCAT_HOME/conf/server.xml中的Host元素中添加:
<Valve className="ch.qos.logback.access.tomcat.LogbackValve" /> |
3. logback預設會在$TOMCAT_HOME/conf下查找檔案 logback-access.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- always a good activate OnConsoleStatusListener --> <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener"/> <property name="LOG_DIR" value="${catalina.base}/logs"/> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_DIR}/access.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>access.%d{yyyy-MM-dd}.log.zip</fileNamePattern> </rollingPolicy> <encoder> <!-- 通路日志的格式 --> <pattern>combined</pattern> </encoder> </appender> <appender-ref ref="FILE"/> </configuration> |
4. 官方配置:
https://logback.qos.ch/access.html#confifiguration