天天看點

java日志大全-第4篇:Logback

作者:不開心就撸代碼

一、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");
   }
}           
輸出:
java日志大全-第4篇:Logback

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>           
輸出:
java日志大全-第4篇:Logback

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>           
輸出:
java日志大全-第4篇:Logback

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>           
輸出:
java日志大全-第4篇:Logback

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>           
輸出:
java日志大全-第4篇:Logback
java日志大全-第4篇:Logback

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