天天看點

番外 03:Java日志架構引入 log4j2(Log For Java version2.x)

前景概要

不管是做什麼項目,日志都是不可或缺的

  • 跟蹤代碼執行過程
  • 跟蹤錯誤
  • 記錄重要操作

而log4j 是功能最強的一個日志工具,用于輸出Log。

為了保證Spring系列的完整性,今天簡單介紹一下log4j2 的使用和簡單配。

執行個體

簡單使用log4j2

項目工程結構

番外 03:Java日志架構引入 log4j2(Log For Java version2.x)

運作結果

右鍵運作 App.java

09:30:26.495 [main] DEBUG me.laiyijie.demo.App - I ’ m just try this!

09:30:26.495 [main] DEBUG me.laiyijie.demo.App - I ’ m just try this!

項目詳解

App.java

package me.laiyijie.demo;

import java.sql.SQLException;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class App {

    public static final Logger logger = LogManager.getLogger(App.class);

    public static void main(String[] args) throws SQLException, ClassNotFoundException {

        logger.debug("I ' m just try this!");

    }

}
           

輸出日志過程如下:

1. 通過

LogManager

getLogger

方法拿到

App.class

的這個類

2. 調用

logger.debug

輸出日志

用起來非常簡單,但是為何一行代碼輸出了兩次log?問題就出在日志的配置上了

而其配置也非常簡單:

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <Properties>
        <Property name="logFilePath">D:/logs/</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>

        <RollingFile name="fileAppender" fileName="${logFilePath}debug/log.txt"
            filePattern="${logFilePath}debug/log-%d{MM-dd-yyyy}.log.gz"
            ignoreExceptions="false">
            <PatternLayout>
                <Pattern>[%d{MMdd HH:mm:ss SSS}] - %m%n</Pattern>
                <Charset>UTF-8</Charset>
            </PatternLayout>
            <TimeBasedTriggeringPolicy />
        </RollingFile>

    </Appenders>


    <Loggers>
        <Logger name="me.laiyijie.demo" level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="fileAppender"></AppenderRef>
        </Logger>

        <Root level="debug">
            <AppenderRef ref="Console" />
            <AppenderRef ref="fileAppender"></AppenderRef>
        </Root>
    </Loggers>

</Configuration>
           

這些配置,可以滿足絕大部分的場景,也就是說,已經是比較完整的一個配置了,隻要了解了這個配置,基本上除非有特殊需求,否則無需再進一步配置。

在這個配置中主要涉及到了三個部分(也就是

Configuration

下面一級配置有三部分)

1. Properties - 隻是配置一下常用屬性,便于更改,在同一個配置檔案中通過

${xxx}

引用

2. Appenders - 配置Log需要從哪兒輸出,輸出格式是什麼

3. Loggers - 控制不同包裡面的日志使用不同的

Appenders

(輸出器)以及輸出的日志等級

下面詳細介紹

Loggers

Appenders

Appenders

在這個配置檔案中配置了兩個

Appenders

:

1. Console - 輸出到控制台,具體格式為

<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />

,這些輸出的格式在此不詳細介紹,完全可以用的時候再去查找官方文檔

2. RollingFile - 以天為機關分檔案輸出到指定位置,并指定打包名稱,輸出檔案位置為

fileName="${logFilePath}debug/log.txt"

,打封包件名稱為

filePattern="${logFilePath}debug/log-%d{MM-dd-yyyy}.log.gz"

,輸出樣式為

<Pattern>[%d{MMdd HH:mm:ss SSS}] - %m%n</Pattern>

詳細的配置可以參照RollingFileAppender官方文檔

說白了就是配置各種各樣不同的輸出器,以保證可以輸出到不同的位置,而我們運作程式以後看到的樣式結果就是通過

Console

這個Appender來進行輸出的。

那到底是為何輸出了兩條呢?讓我來看看Loggers的配置就知道了

Loggers

這個配置中有兩條:

  • Logger - 以包名為基礎控制不同包下的日志輸出行為,下面介紹其屬性
    1. name -

      name="me.laiyijie.demo"

      ,也就是意味着,在

      me.laiyijie.demo

      包下面的所有類中的Logger都被包含在這個Logger之内(注意:包括其所有子包,例如

      me.laiyijie.demo.service

    2. level -

      level="debug"

      debug

      等級以上的日志都需要輸出,日志等級按嚴重程度遞減排序為(fatal,error,info,debug,trace)也就是說,除了trace以外的其他所有都會輸出
    3. 關聯輸出器(Appenders)可以看出Console關聯了兩個輸出器,分别是

      Console

      fileAppender

      ,也就是說既會輸出在控制台,也會輸出在檔案
  • ROOT - 根輸出器,工程中所有的日志管理,在這裡也是配置了兩個Appender-ref,

    Console

    fileAppender

有Logger和ROOT分别輸出了一條到

Console

這也是為什麼一行語句會有兩個輸出到控制台的原因!!

如果想解決這個問題,也就是說想要輸出過一次日志後不再輸出,就要通過

additivity="false"

來控制,也就是說把Logger的配置更換如下:

<Logger name="me.laiyijie.demo" level="debug" additivity="false">
    <AppenderRef ref="Console" />
    <AppenderRef ref="fileAppender"></AppenderRef>
</Logger>
           

增加了一個

additivity

屬性!這樣的話,日志檢測到後不會繼續向下傳遞到ROOT再次輸出。

配置完畢,愉快快的使用log4j2吧!請記住,配置檔案要放在classpath中,并且以log4j.xml為名稱。詳細載入配置檔案過程可以參考官方文檔中的自動配置

附:

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>me.laiyijie</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>

        <!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.7</version>
        </dependency>

    </dependencies>
</project>