使用 logback + slf4j 進行日志記錄


此處主要介紹maven web工程下如何使用 logback + slf4j  進行日志記錄。

logback主要包含三個組成部分:Loggers(日志記錄器)、Appenders(輸出目的在)、Layouts(日志輸出格式)

 

slf4j :如jdbc一樣,定義了一套接口,是一個日志門面,可實現多個日志系統間快速切換(通過修改配置文件)

logback : 和log4j是同一作者,是log4j的升級版,效果可想而知.

logback 主要分為三個模塊,分別是:

  logback-core:提供基礎功能,是其他兩個模塊的基礎
  logback-classic : log4j的升級,實現了self4j api
  logback-access:用於與sevlet容器進行集成、提供網絡訪問日志的功能

 

logback初始化時,默認會去classpath下依次加載如下配置文件(logback.groovy、logback-test.xml、logback.xml),當找不到配置文件時logback將為rootLogger 添加一個 ConsoleAppender ,用於將日志輸出到控制台。對於logback的初始化,官網有如下描述

Logback tries to find a file called logback.groovy in the classpath.

If no such file is found, logback tries to find a file called logback-test.xml in the classpath.

If no such file is found, it checks for the file logback.xml in the classpath..

If no such file is found, service-provider loading facility (introduced in JDK 1.6) is used to resolve the implementation of com.qos.logback.classic.spi.Configurator interface by looking up the file META-INF\services\ch.qos.logback.classic.spi.Configurator in the class path. Its contents should specify the fully qualified class name of the desired Configurator implementation.

If none of the above succeeds, logback configures itself automatically using the BasicConfigurator which will cause logging output to be directed to the console.

編程時可是要如下代碼查看logback內部運行情況:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);

對於web項目,可配置sevlet,然后通過網頁查看logback內部運行狀態,如下:

<!-- 通過瀏覽器以html形式查看logback內部狀態 :http://host/yourWebapp/lbClassicStatus -->
    <servlet>
        <servlet-name>ViewStatusMessages</servlet-name>
        <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>ViewStatusMessages</servlet-name>
        <url-pattern>/lbClassicStatus</url-pattern>
    </servlet-mapping>

說了一大堆廢話,現在開始進入主題:

首先,在pom文件引入相關依賴,如下:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
     <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.0.13</version>
</dependency>

接着,編寫logback.xml(位於classpath目錄下,此處為src/main/resources目錄)

<?xml version="1.0" encoding="UTF-8"?>
<!--debug="true" : 打印logback內部狀態(默認當logback運行出錯時才會打印內部狀態 ),配置該屬性后打印條件如下(同時滿足): 
    1、找到配置文件 2、配置文件是一個格式正確的xml文件 也可編程實現打印內部狀態,例如: LoggerContext lc = (LoggerContext) 
    LoggerFactory.getILoggerFactory(); StatusPrinter.print(lc); -->
<!-- scan="true" : 自動掃描該配置文件,若有修改則重新加載該配置文件 -->
<!-- scanPeriod="30 seconds" : 配置自動掃面時間間隔(單位可以是:milliseconds, seconds, minutes 
    or hours,默認為:milliseconds), 默認為1分鍾,scan="true"時該配置才會生效 -->
<configuration debug="false" scan="true" scanPeriod="30 seconds" packagingData="true">
    <!-- 設置 logger context 名稱,一旦設置不可改變,默認為default -->
    <contextName>myAppName</contextName>
    
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <!-- encoders are by default assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        <!-- 當前活動日志文件名 -->
        <file>./my_log.log</file>
        <!-- 文件滾動策略根據%d{patter}中的“patter”而定,此處為每天產生一個文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 歸檔文件名“.zip或.gz結尾”,表示歸檔文件自動壓縮 -->
            <FileNamePattern>./my_log%d{yyyyMMdd}.log.zip</FileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
       
        <!--rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>renhai%i.log</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>10</maxIndex>
        </rollingPolicy>
        
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>20MB</maxFileSize>
        </triggeringPolicy-->
        
        <!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
          rollover daily
          <fileNamePattern>mylog-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
           each file should be at most 30MB, keep 60 days worth of history, but at most 20GB
           <maxFileSize>30MB</maxFileSize>    
           <maxHistory>60</maxHistory>
           <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy> -->
        

        <encoder>
          <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread]%logger{36} - %msg%n</pattern>
          <!-- <pattern>%d{HH:mm:ss.SSS}[%-5level][%thread] - %msg%n</pattern> -->
        </encoder>
    </appender>
    
    <!-- 日志級別若沒顯示定義,則繼承最近的父logger(該logger需顯示定義level,直到rootLogger)的日志級別-->
    <!-- logger的appender默認具有累加性(默認日志輸出到當前logger的appender和所有祖先logger的appender中),可通過配置 “additivity”屬性修改默認行為-->
    <logger name="com.yinz"  level="debug" additivity="false" >
        <appender-ref ref="FILE"/>
    </logger>

    <!-- 至多只能配置一個root -->
    <root level="debug">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

最后,就可以在程序中使用logback了,例如:

package com.yinz.aaa;

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

public class Test {

    public static void main(String[] args) {
        Logger logger = LoggerFactory.getLogger(Test.class);
        logger.debug("test........");
    }
}

如上所述,我們使用的slf4j中的api,如此依賴,要想在多個日志系統間切換,只需要提供相應的配置文件就可以了,而不需要修改編碼部分。

 

最后有幾點需要注意:

1、logger 的日志級別若沒顯示定義,則繼承最近的祖先logger(該logger需顯示定義level,直到rootLogger)的日志級別。

  1.1,、logger的父子關系,由logger的名稱決定,例如有三個logger,分別為:java.lang.util 、 java.lang  、java

  則,java是java.lang的父logger, 是java.lang.util的祖先logger. 而同時java.lang是java.lang.util的父logger

2、logger的appender默認具有累加性(默認日志輸出到當前logger的appender和所有祖先logger的appender中),可通過配置 “additivity”屬性修改默認行為


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM