AdSense

網頁

2019/9/1

Log4j2 Logger Level Order 等級高低順序

Log4j2內建的Level等級由高至低順序如下。

高---------------------------------------低
FETAL > ERROR > WARN > INFO > DEBUG > TRACE

每個Level有對應的intLevel整數值,數值越小等級越高,數值越大等級越低。

LevelintValue用途
OFF0不輸出任何日誌
FETAL100造成應用程式停止的日誌
ERROR200造成應用程式錯誤的日誌
WARN300可能導致錯誤的日誌
INFO400一般資訊的日誌
DEBUG500除錯資訊的日誌
TRACE600更細的除錯資訊,通常用來追蹤程式流程的日誌
ALLInteger.MAX_VALUE輸出所有日誌

Logger輸出的等級大於等於Logger設定的等級時才會輸出訊息。


請見下面範例。

下面為在Spring Boot專案類別中使用Logger的各等級輸出。Logger設定未修改,未添加任何log4j2的配置檔(例如log4j.propperties),Spring Boot預設的Logger等級為INFO

package com.abc.demo.service;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Service;

@Service
public class DemoService {
    
    private static final Logger log = LogManager.getLogger(DemoService.class);
    
    public void logTest() {
        
        Level level = log.getLevel(); // INFO
        
        System.out.println("Logger name:" + log.getName());
        System.out.println("LEVEL name:" + level.name());
        System.out.println("LEVEL intLevel:" + level.intLevel());
        
        log.fatal("FATAL"); // 印出
        log.error("ERROR"); // 印出
        log.warn("WARN");   // 印出
        log.info("INFO");   // 印出
        log.debug("DEBUG");
        log.trace("TRACE");
    }

}

執行結果如下,可以看到僅Logger輸出等級大於等於INFO的才會被印出。

Logger name:com.abc.demo.service.DemoService
LEVEL name:INFO
LEVEL intLevel:400
2019-09-01 21:51:29.116 FATAL 11868 --- [           main] c.a.d.s.DemoService                      : FATAL
2019-09-01 21:51:29.117 ERROR 11868 --- [           main] c.a.d.s.DemoService                      : ERROR
2019-09-01 21:51:29.117  WARN 11868 --- [           main] c.a.d.s.DemoService                      : WARN
2019-09-01 21:51:29.117  INFO 11868 --- [           main] c.a.d.s.DemoService                      : INFO

若在程式中把Logger的等級調整為ERROR如下。

package com.abc.demo.service;

import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.core.config.Configurator;
import org.springframework.stereotype.Service;

@Service
public class DemoService {
    
    private static final Logger log = LogManager.getLogger(DemoService.class);
    
    public void logTest() {
        
        Configurator.setLevel("com.abc.demo.service.DemoService", Level.ERROR); // 改為ERROR

        Level level = log.getLevel(); // ERROR
        
        System.out.println("Logger name:" + log.getName());
        System.out.println("LEVEL name:" + level.name());
        System.out.println("LEVEL intLevel:" + level.intLevel());
        
        log.fatal("FATAL"); // 印出
        log.error("ERROR"); // 印出
        log.warn("WARN");
        log.info("INFO");
        log.debug("DEBUG");
        log.trace("TRACE");
    }

}


執行結果如下,可以看到僅Logger輸出等級大於等於ERROR的才會被印出。

Logger name:com.abc.demo.service.DemoService
LEVEL name:ERROR
LEVEL intLevel:200
2019-09-01 22:58:04.610 FATAL 8100 --- [           main] c.a.d.s.DemoService                      : FATAL
2019-09-01 22:58:04.611 ERROR 8100 --- [           main] c.a.d.s.DemoService                      : ERROR

此外Logger又有繼承父Logger等級的特性,這一點要同時被考慮。


參考:

沒有留言:

AdSense