1. 程式人生 > >日誌框架Slf4j和Logback的使用說明

日誌框架Slf4j和Logback的使用說明

1.什麼是日誌框架

  • 是一套能實現日誌輸出的工具包
  • 能夠描述系統執行狀態的所有時間可以算作日誌
    • 使用者下線
    • 介面超時
    • 資料庫崩潰

2.日誌框架的能力

  • 定製輸出目標
    • 可以以檔案的形式儲存在固定的地方
    • 日誌檔案的滾動策略,如一天一個數據檔案等
    • 日誌存到資料庫等要求
  • 定製輸出格式,方便後期加工和處理
  • 攜帶上下文資訊
  • 執行時選擇性輸出,不同情況下輸出的內容不同
  • 靈活的配置
  • 優異的效能

3.常見的日誌框架

日誌門面 日誌實現
Apache :JCL Log4j
SLF4j Log4j2
jboss-logging Logback
Java:JUL

最優框架:SLF4j+Logback

4.日誌框架的使用

4.1Slf4j的使用

1.基本使用

  • 首先基於SpringBoot搭建框架,然後書寫測試類

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class LoggerTest {
        //選擇slf4j下的類,同時填寫當前類的類名,這樣打印出來的日誌也是當前類的全包名。
        //當然也可以設定其他的類名,那麼就會打印出設定的類名
        private final Logger logger=LoggerFactory.getLogger(LoggerTest.class);
    
        @Test
        public
    void test1(){ logger.debug("--debug--"); logger.info("--info--"); logger.error("--error--"); } }

    列印後檢視控制檯資訊,日誌是當前類的全包名

    2018-10-20 16:46:21.391  INFO 23112 --- [           main] com.antfin.sell.LoggerTest               : --info--
    2018-10-20 16:46:21.391 ERROR 23112 --- [           main] com.antfin.sell.LoggerTest               : --error--
    
    

    這是因為預設的日誌級別是info,小於info級別的日誌不會列印。

    可以檢視org.slf4j.event檢視日誌級別

     ERROR, 
     WAR, 
     INFO,
     DEBUG, 
     TRACE;
    

2.使用lombok工具

  • 改進日誌類,每次都需要寫入當前類比較麻煩,可以使用lombok外掛來簡化

    • 新增依賴
    <dependency>
    	<groupId>org.projectlombok</groupId>
    	<artifactId>lombok</artifactId>
    </dependency>
    
    • 使用註釋Slf4j,變數名稱直接為log
    @RunWith(SpringRunner.class)
    @SpringBootTest
    //lombok.extern.slf4j.Slf4j;
    @Slf4j 
    public class LoggerTest2 {
    
        @Test
        public void test1(){
            log.debug("--debug--");
            log.info("--info--");
            log.error("--error--");
        }
    }
    

    注意:如果找不到log變數,那麼新增idea需要新增外掛Lombok Plugin,再重啟即可。

3.日誌中打印出變數

  • 使用佔位符{}
String name="imooc";
String pass="123456";
log.info("name:{},pass:{}",name,pass);

4.2Logback的配置

  • application.yml 比較簡單。只能配置路徑和輸出格式等簡單的操作。
  • logback-spring.xml 比較複雜,但是相應的功能也比較強大。

4.2.1 需求出發

  • 區分info和error日誌
  • 每天產生一個日誌檔案

4.2.2 application.yml

logging:
  pattern:
    console: "%d - %msg%n"
  #path: F:\logs\springboot
  file: F:\logs\springboot\sell.log
  level:
     com:  debug

具體的可以根據註釋看到:

  • path和file都是指定路徑的,但是file可以指定檔名
  • 對於指定級別 指定範圍可以指定類,也可以說是包名。或者直接是root

4.2.3 logback-spring.xml

  • logback-spring.xml位於resources目錄下
1.基本版

注意格式要正確,因為沒有提示要小心出錯。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--控制檯的輸出-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--展示格式-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d - %msg%n
            </pattern>
        </layout>
    </appender>
    <!--範圍和級別 root整個專案都適用-->
    <root level="info">
        <appender-ref ref="consoleLog"/>
    </root>
</configuration>
2.配置到輸出檔案,且每天產生一個日誌檔案
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!--輸出檔案的配置-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <pattern>
                %msg%n
            </pattern>
        </encoder>
        <!--滾動策略-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--路徑-->
            <fileNamePattern>F:\logs\sell\info.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <!--範圍和級別 root整個專案都適用-->
    <root level="info">
        <appender-ref ref="fileInfoLog"/>
    </root>
</configuration>
3.區分info和error日誌
  • 對於error的日誌只需要在其節點內加入<filter></filter>進行過濾即可,意思是隻攔截Error及以上級別的日誌,所以只想保留INFO是不可以的

    <!--根據範圍來過濾-->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
    	<level>ERROR</level>
    </filter>
    
  • 對於info的日誌也使用標籤<filter></filter>,但使用另外一個類LevelFilter,點選該類可以看到有三個DENY\NEUTRAL\ACCEPT 操作。如果選擇ACCEPT,則 則使用該條規則,選擇NEUTRAL則忽略該條規則。

    <!--根據範圍來過濾-->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
        <level>ERROR</level>
        <!--符合級別就過濾掉-->
        <onMatch>DENY</onMatch>
        <!--符合就接受-->
        <onMismatch>ACCEPT</onMismatch>
    </filter>
    
  • 完整的日誌配置規則

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

    <!--控制檯的輸出-->
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <!--展示格式-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>
                %d - %msg%n
            </pattern>
        </layout>
    </appender>

    <!--輸出檔案的配置  INFO-->
    <appender name="fileInfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--根據範圍來過濾-->
        <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>F:\logs\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>F:\logs\sell\error.%d.log</fileNamePattern>
        </rollingPolicy>
    </appender>
    <!--範圍和級別 root整個專案都適用-->
    <root level="info">
        <appender-ref ref="consoleLog"/>
        <appender-ref ref="fileInfoLog"/>
        <appender-ref ref="fileErrorLog"/>
    </root>
</configuration>

5.進階