1. 程式人生 > >Spring boot-Logback

Spring boot-Logback

 

1、logback簡單介紹
  開源,是Log4j的改良版本
  Springboot提供了一套日誌系統,lockback是最優選擇
 2、結構
   logback被分為三個元件:core、classic、access
   其中,core提供了Logback的核心功能,另外兩個元件在其基礎之上;
   classic實現了Slf4j的Api,當需要配合Slf4j使用時,需要將classic引入進來;
   access為了繼承Servlet環境而準備,可提供Http_accrss日誌介面
  3、配置
  在pom.xml檔案中加入:
   <!--logback依賴匯入-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        即可

    先寫一個測試類:

    package com.dairy.sell;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/*
Logback測試
 */

@RunWith(SpringRunner.class)
@SpringBootTest
//@Slf4j

public class LogTest {
	//新增@Slf4j註釋後這裡就不需要使用了
  private final Logger logger= LoggerFactory.getLogger(LogTest.class);

    @Test
    public void test1() {
        String name = "dairy";
        String password = "123";
        log.debug("debug");
        log.info("name:{},password:{}", name, password);
        log.error("error");
        log.warn("warm");

    }
}
其輸入結果可以在控制檯上檢視,但是這樣的方式顯然太麻煩,需要新增每個需要log日誌的類。所以放在註釋的內容。
4、方式一:在SpringBoot的配置檔案加入Logback的相關配置,如下:

// #    日誌變短
logging:
  pattern:
  // 日誌輸入的格式
    console: "%d -%msg%n"
// #    log檔案存放的位置

  path: /var/log/tomcat/sell
// #  log檔案
  file: /var/log/tomcat/sell/dairui.log
  // 指定級別
  level: debug
    // 指定log的類
   level:
     com.dairy.sell.LogTest: debug
     方式二:在根目錄下新增logback-spring.xml檔案:
     <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  // logback的核心類
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
       // 設定輸入的格式可點進去看原始碼
       //  defaultConverterMap.putAll(Parser.DEFAULT_COMPOSITE_CONVERTER_MAP);
       //  defaultConverterMap.put("d", DateConverter.class.getName());
       //  defaultConverterMap.put("date", DateConverter.class.getName());
       //  defaultConverterMap.put("r", RelativeTimeConverter.class.getName());
       //  defaultConverterMap.put("relative", RelativeTimeConverter.class.getName());
       //  defaultConverterMap.put("level", LevelConverter.class.getName());
       //  defaultConverterMap.put("le", LevelConverter.class.getName());
       //  defaultConverterMap.put("p", LevelConverter.class.getName());
       //  defaultConverterMap.put("t", ThreadConverter.class.getName());
       //  defaultConverterMap.put("thread", ThreadConverter.class.getName());
    // 對輸出命名、格式、顏色等設定
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d -%msg%n
            </pattern>
        </layout>


    </appender>
    // 設定日誌每天輸出,並放到資料夾中
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
    // 設定日誌等級 預設級別是debug
        <filter class="ch.qos.logback.classic.filter.LevelFilter">

            <Level>ERROR</Level>
            // 靜止其他的,比它等級高的
            <onMatch>DENY</onMatch>
            <onMismatch>ACCEPT</onMismatch>
        </filter>
        <encoder>
            <pattern>

                %msg%n
            </pattern>
        </encoder>
        // 檔案位置 一定要絕對位置
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/tomcat/sell/info.%d.log</fileNamePattern>

        </rollingPolicy>

    </appender>
    <appender name="fileErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <Level>ERROR</Level>
        </filter>
        <encoder>
            <pattern>

                %msg%n
            </pattern>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>/var/log/tomcat/sell/error.%d.log</fileNamePattern>

        </rollingPolicy>

    </appender>
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileErrorLog"/>
        <appender-ref ref="fileInfoLog"/>

    </root>

</configuration>

第二個Logback配置檔案

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定義日誌檔案的儲存地址 勿在 LogBack 的配置中使用相對路徑-->
    <property name="LOG_HOME" value="/home" />  
    <!-- 控制檯輸出 -->   
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
             <!--格式化輸出,%d:日期;%thread:執行緒名;%-5level:級別,從左顯示5個字元寬度;%msg:日誌訊息;%n:換行符--> 
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder>
    </appender>
    <!-- 按照每天生成日誌檔案 -->   
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">   
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌檔案輸出的檔名-->
            <FileNamePattern>${LOG_HOME}/TestWeb.log.%d{yyyy-MM-dd}.log</FileNamePattern> 
            <!--日誌檔案保留天數-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>   
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 
            <!--格式化輸出,%d:日期;%thread:執行緒名;%-----------------5level:級別,從左顯示5個字元寬度;%msg:日誌訊息;%n:換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>   
        </encoder> 
        <!--日誌檔案最大的大小-->
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MB</MaxFileSize>
       </triggeringPolicy>
    </appender> 
   <!-- show parameters for hibernate sql 專為 Hibernate 定製 --> 
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder"  level="TRACE" />  
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor"  level="DEBUG" />  
    <logger name="org.hibernate.SQL" level="DEBUG" />  
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />  
    
    <!--myibatis log configure--> 
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>
    
    <!-- 日誌輸出級別 -->
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root> 
     <!--日誌非同步到資料庫 -->  
    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <!--日誌非同步到資料庫 --> 
        <connectionSource class="ch.qos.logback.core.db.DriverManagerConnectionSource">
           <!--連線池 --> 
           <dataSource class="com.mchange.v2.c3p0.ComboPooledDataSource">
              <driverClass>com.mysql.jdbc.Driver</driverClass>
              <url>jdbc:mysql://127.0.0.1:3306/databaseName</url>
              <user>root</user>
              <password>root</password>
            </dataSource>
        </connectionSource>
  </appender>
</configuration>

5、測試類

package com.dairy.sell;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;

import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/*
Logback測試
 */

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j

public class LogTest {
//    private final Logger logger= LoggerFactory.getLogger(LogTest.class);

    @Test
    public void test1() {
        String name = "dairy";
        String password = "123";
        log.debug("debug");
        log.info("name:{},password:{}", name, password);
        log.error("error");
        log.warn("warm");

    }
}
輸出結果:
2018-08-25 09:22:25.149---------- [main] INFO  com.dairy.sell.LogTest - Started LogTest in 4.305 seconds (JVM running for 6.237)
2018-08-25 09:22:25.299---------- [main] INFO  com.dairy.sell.LogTest - name:dairy,password:123
2018-08-25 09:22:25.299---------- [main] ERROR com.dairy.sell.LogTest - error
2018-08-25 09:22:25.300---------- [main] WARN  com.dairy.sell.LogTest - warma