前景概要
不管是做什麼項目,日志都是不可或缺的
- 跟蹤代碼執行過程
- 跟蹤錯誤
- 記錄重要操作
而log4j 是功能最強的一個日志工具,用于輸出Log。
為了保證Spring系列的完整性,今天簡單介紹一下log4j2 的使用和簡單配。
執行個體
簡單使用log4j2
項目工程結構
運作結果
右鍵運作 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 - 以包名為基礎控制不同包下的日志輸出行為,下面介紹其屬性
- name -
,也就是意味着,在name="me.laiyijie.demo"
包下面的所有類中的Logger都被包含在這個Logger之内(注意:包括其所有子包,例如me.laiyijie.demo
)me.laiyijie.demo.service
- level -
在level="debug"
等級以上的日志都需要輸出,日志等級按嚴重程度遞減排序為(fatal,error,info,debug,trace)也就是說,除了trace以外的其他所有都會輸出debug
- 關聯輸出器(Appenders)可以看出Console關聯了兩個輸出器,分别是
和Console
,也就是說既會輸出在控制台,也會輸出在檔案fileAppender
- name -
- 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>