1. 程式人生 > >使用slf4j和logback記錄日誌

使用slf4j和logback記錄日誌

前言
Logback是由log4j創始人設計的一個開源日誌元件, 效能比log4j的效能還好, 將會逐步地替代掉log4j,Logback需要和slf4j一起使用,slf4j只提供介面,沒有提供具體的實現,Logback很好的實現slf4j中的介面,現在來看看如何使用logback記錄日誌

匯入依賴
logback依賴如下幾個Jar包
slf4j-api.jar,logback-core.jar,logback-classic.jar,logback-access.jar

在pom.xml引入依賴包

<dependency>
    <groupId>org.slf4j</groupId
>
<artifactId>slf4j-api</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-access</artifactId> <version>1.1.7</version> </dependency> <dependency
>
<groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.7</version> <scope>runtime</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId
>
<version>1.1.7</version> </dependency>

配置日誌檔案
在src/main/resources目錄下新增logback-dp.xml日誌檔案,內容如下

<?xml version="1.0" ?>
<configuration debug="false">
    <!--控制檯日誌 -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                <!--日誌輸出格式-->
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- INFO級別日誌,記錄INFO級別及比INFO更高級別的日誌-->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>
                <!--日誌引檔案路徑-->
                C:\workspace\logs\%d{yyyy-MM-dd}\dp.log
            </fileNamePattern>
            <!-- 日誌儲存15天,超過15天自動刪除 -->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>
                <!--日誌輸出格式-->
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- ERROR級別日誌,只記錄Error級別日誌 -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 過濾器,只記錄ERROR級別的日誌,如果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>
                <!--日誌檔案路徑-->
                C:\workspace\logs\%d{yyyy-MM-dd}\dp.error.log
            </fileNamePattern>
            <!-- 日誌儲存15天,超過15天自動刪除 -->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>
                <!--日誌輸出格式-->
                %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <root>
        <!-- 日誌級別 -->
        <level value="INFO"/>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="INFO"/>
        <appender-ref ref="ERROR"/>
    </root>
</configuration>

配置日誌監聽器
在web.xml檔案中配置日誌監聽器

<context-param>
 <param-name>logbackConfigLocation</param-name>
  <param-value>classpath:logback-dp.xml</param-value>
</context-param>
<listener>
  <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class>
</listener>

驗證

//匯入的包都是slf4j的包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Controller
@RequestMapping("/taskwait")
public class TaskController{
    private static final Logger logger = LoggerFactory.getLogger(TaskController.class);

    @RequestMapping(value = { "/queryActivity.rf" }, method = RequestMethod.POST)
    @ResponseBody
    public void queryActivity(@RequestBody OTCActivityConditionVO conditionVO) {
        logger.trace("logback的--trace日誌--輸出了");
        logger.debug("logback的--debug日誌--輸出了");
        logger.info("logback的--info日誌--輸出了");
        logger.warn("logback的--warn日誌--輸出了");
        logger.error("logback的--error日誌--輸出了");
    }
}

指定root中的級別為info,只會輸出info和比info級別更高的日誌
這裡寫圖片描述

同時在C:\workspace\logs\目錄下生成了按日期命名的目錄及檔案
這裡寫圖片描述

dp.log檔案,記錄了info,warn,error級別的日誌,因為沒有配置日誌過濾規則,凡是info級別及比info更高級別的日誌,都會記錄到dp.log檔案中
這裡寫圖片描述
而dp.error.log檔案中,只記錄了error級別的日誌,因為配置日誌過濾規則,只匹配error級別的日誌
這裡寫圖片描述