IDEA整合日誌框架Log4j2+Slf4j詳細配置過程

IDEA整合日誌框架Log4j2+Slf4j詳細配置過程

日誌框架這麼多,他們之間到底是什麼關係呢?籠統的講就是slf4j是一系列的日誌接口,而log4j2、logback是具體實現了接口功能的日誌框架。現在的主流日誌接口都使用slf4j,而日誌的實現就見仁見智了,至於他們的關係請自行百度,此處選擇log4j2作爲實現框架。網上看到的教程要麼對代碼沒有解釋,對新手不友好;要麼時間比較久遠,跟不上時代。這裏使用新版本並結合大量註釋,力求簡潔明瞭,有什麼問題歡迎留言交流。

運行環境:

  • log4j2 2.8.2 + slf4j 1.7.25
  • IntelliJ IDEA 2017.2.5
  • maven 3.0.5

配置過程

Step 1:導入maven依賴


    <properties>
        <slf4j.version>1.7.25</slf4j.version>
        <log4j.version>2.8.2</log4j.version>
    </properties>

     <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>${slf4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-web</artifactId>
            <version>${log4j.version}</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>${log4j.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>${log4j.version}</version>
        </dependency>     

 

 

Step 2:添加配置文件

配置文件可以直接在resources文件夾下創建,文件名爲log4j2.xml,log4j2的相關組件會自動掃描log4j2.xml或log4j2.properties(log4j2 同時支持多種屬性配置方式,log4j2.xml或log4j2.properties爲官方指定的配置文件名,具體信息參見官方文檔)。該文件夾是IDEA專門用來存放各種配置文件的地方,如果使用前面所示的文件名就不需要指定配置文件的位置。如果想放在其他文件夾下,則需要在web.xml文件中添加如下配置:

    <context-param>
        <param-name>log4jConfiguration</param-name>
        <!-- 日誌配置文件路徑,請根據具體項目自行調整 -->
        <param-value>classpath:conf/log4j2.xml</param-value>
    </context-param>    

 

我的配置文件log4j2.xml內容如下(此處並沒有將日誌信息輸出到外部文件)


<?xml version="1.0" encoding="utf-8"?>
<!--日誌級別:TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置爲WARN,則低於WARN的信息都不會輸出-->
<!--
    status : 這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,會看到log4j2內部各種詳細輸出
    monitorInterval : Log4j能夠自動檢測修改配置文件和重新配置本身, 設置間隔秒數。此處表示每隔300秒重讀一次配置文件
-->
<Configuration status="ERROR" monitorInterval="300">
    <!--<properties>-->
    <!--<property name="LOG_HOME">F:\logs</property>-->
    <!--<property name="ERROR_LOG_FILE_NAME">error</property>-->
    <!--</properties>-->
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT"> <!-- 定義類型爲Console的Appender -->
            <PatternLayout pattern="%d{HH:mm:ss} [%level] %c{10} - %msg%n"/> <!-- 定義類型爲Pattern的Layout -->
        </Console>
    </Appenders>
    <!--定義logger,只有定義了logger並引入上面的appender,appender纔會生效-->
    <Loggers>
        <Root level="error"> <!-- 定義Root Logger -->
            <AppenderRef ref="Console"/> <!-- Root Logger的Appender引用上面定義的Console -->
        </Root>
        <!--定義名字爲MainLogger的Logger,其日誌級別爲info,info以下級別的信息將不會輸出 -->
        <Logger name="MainLogger" level="info" additivity="false">
            <AppenderRef ref="Console"/> <!-- Root Logger的Appender引用上面定義的Console -->
        </Logger>
    </Loggers>
</Configuration> 

 

如果使用log4j2.properties的形式配置log4j2,則參見如下配置(兩個配置文件不屬於同一個項目,所以配置信息略有不同):

 

# 指定log4j2內部的日誌輸出級別,低於指定級別的日誌將不會輸出,ALL表示輸出所有日誌信息
# 日誌級別:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
status = warn
# 配置日誌信息輸出到哪裏:err表示作爲標準錯誤輸出,還可以是一個文件路徑或者一個URL
dest = err
# 指定配置的名稱
name = Log4jPropertiesConfig
#使用“property.* ”來指定下方可能用到的屬性值
property.RollingFileName = target/log/log4j2test.log
property.ConsoleLogLevel = info

filter.threshold.type = ThresholdFilter
filter.threshold.level = debug

# ConsoleAppender:定義輸出到命令行的日誌輸出器
# ThresholdFilter:臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別低於臨界值時,日誌輸出會被拒絕
appender.console.type = Console
appender.console.name = Console_OUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c: %msg%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = ${ConsoleLogLevel}

# RollingFileAppender:輸出到滾動文件的日誌輸出,它會判斷文件是否滿足封存文件的要求,若滿足,則將文件封存並把日誌寫入到下一個滾動文件。
# RollingFileAppender需要TriggeringPolicy來指定觸發封存的條件,還需要RolloverStrategy來告訴輸出器如何封存文件
# 此處使用複合型觸發策略(時間和文件大小),具體配置參考:http://blog.csdn.net/henry115/article/details/78483457
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${RollingFileName}
appender.rolling.filePattern = target/log/log1-%d{yy-MM-dd-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %C{1.} [%t]: %msg%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 12
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 10

# 定義名字爲TestController的Logger,其日誌級別爲debug
# Logger日誌信息輸出的目的地由“logger.rolling.appenderRef.rolling.ref”指定
# 當“logger.rolling.additivity”屬性值爲false時,則子Logger只會在自己的appender裏輸出
#logger.rolling.level = debug
logger.rolling.name = MainController
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = Console_OUT

# 此處指定日誌輸出級別無效,輸出級別由其引用的輸出器指定
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = Console_OUT

 

 

Step 3: 在Java文件中使用slf4j打印日誌信息:

 此處注意Logger的名稱必須與配置文件中對應

 

@Controller
public class MainController {
    // 獲取log4j2.xml文件中定義的名爲“MainLogger”的Logger
    // 如果沒有對應名稱的Logger,則無法使用Logger記錄和輸出日誌信息
    private static final Logger log = LoggerFactory.getLogger("MainLogger");

    @RequestMapping(value = "/test")
    public String test(){
        log.info("info...");
        log.debug("debug...");
        log.warn("warn...");
        log.error("error...");
        return "test";
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章