1、主要組件
a) Logger Hierarchy
如果一個LoggerConfig的名稱加上一個點,是另一個LoggerConfig的名稱前綴,那麼就說這個LoggerConfig是另一個LoggerConfig的祖先;如果一個LoggerConfig與另一個LoggerConfig之間不存在其它祖先LoggerConfig,那麼就說這個LoggerConfig是另一個LoggerConfig的父級。
Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
// 或者
Logger logger = LogManager.getRootLogger();
b) LoggerContext
c) Configuaration
d) Logger
Logger x = LogManager.getLogger("wombat");
Logger y = LogManager.getLogger("wombat");
System.out.println(x == y); // 打印true
e) LoggerConfig
f) Filter
g) Appender
h) Layout
i) StrSubstitutor 、StrLookUp
2、jar包引入
package guwen;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LogTest {
private static final Logger log = LogManager.getLogger(LogTest.class);
public static void main(String[] args) {
log.error("Hello, Log4j.");
log.info("Hello, Log4j.");}}
log.debug("Hello, Log4j.") } }
log4j 2.x需要引入兩個jar包,分別是log4j-api.jar和log4j-core.jar。執行上面的代碼,結果如下:
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
15:11:52.731 [main] ERROR guwen.LogTest - Hello, Log4j.
如果沒有引入log4j-core.jar,也可以運行,但結果如下:
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
ERROR LogTest Hello, Log4j.
3、配置文件
從上面的提示可以看出,只需要引入jar包,即使沒有任何配置文件,log4j也能正常工作。但紅色部分提示:在沒有提供配置的情況下,只會打印錯誤信息到控制檯。
log4j 2.x能夠在初始化的時候自動加載配置文件,Log4j2提供了三種ConfiguarationFactory的實現:JSON、YAML、XML。
log4j 2.x的初始化過程爲:
(1)log4j會檢查log4j.configuarationFile系統屬性,如果設置了這個屬性,它就會試着去使用與文件擴展對應的ConfiguarationFactory去加載配置。
(2)如果沒有log4j.configuarationFile系統屬性,YAML ConfiguarationFactory就會試着在classpath中查找log4j2-test.yaml或者log4j2-test.yml;
(3)如果沒有找到yaml配置文件,JSON ConfiguarationFactory就會試着在classpath中查找log4j2-test.json或者log4j2-test.jsn;
(4)如果沒有找到json配置文件,XML ConfiguarationFactory就會試着在classpath中查找log4j2-test.xml;
(5)如果以上測試環境配置文件都無法找到,YAML ConfiguarationFactory就會試着在classpath中查找log4j2.yaml或者log4j2.yml;
(6)如果沒有找到yaml配置文件,JSON ConfiguarationFactory就會試着在classpath中查找log4j2.json或者log4j2.jsn;
(7)如果沒有找到json配置文件,XML ConfiguarationFactory就會試着在classpath中查找log4j2.xml;
(8)如果沒有找到任何配置文件,log4j將會使用DefaultConfiguaration,這會導致日誌被輸出到控制檯。
經過測試,所謂的log4j.configuarationFile屬性,以鍵值對的方式保存在classpath下的log4j2.component.properties屬性文件中,它的取值是指定的配置文件名。4、日誌級別
在第2部分就已經看到,不提供任何配置時,log4j也能以默認的配置輸出正常日誌信息。以xml配置爲例,實際上默認的配置等價於以下配置文件的配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</Console>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
將這個文件以log4j2.xml命名,並放置於src目錄下,再次執行上面的代碼,得到如下結果:
19:53:14.646 [main] ERROR guwen.LogTest - Hello, Log4j.
可以看出,打印結果並沒有太大的變化,只是沒有了找不到配置文件的提示信息。但是因爲默認配置中日誌級別是ERROR,所以還是隻打印了Logger.error的執行結果。修改配置中的Root節點的level屬性爲info,再次執行代碼,得到結果如下:
19:56:33.904 [main] ERROR guwen.LogTest - Hello, Log4j.
19:56:33.905 [main] INFO guwen.LogTest - Hello, Log4j.
再次修改level屬性爲debug,執行代碼,得到結果如下:
19:57:38.704 [main] ERROR guwen.LogTest - Hello, Log4j.
19:57:38.705 [main] DEBUG guwen.LogTest - Hello, Log4j.
19:57:38.705 [main] INFO guwen.LogTest - Hello, Log4j.
實際上log4j包含7個日誌級別:
- 關閉:OFF(0)
- 致命:FATAL(100),對應Logger.fatal方法
- 錯誤:ERROR(200),對應Logger.error方法
- 警告:WARN(300),對應Logger.warn方法
- 信息:INFO(400),對應Logger.info方法
- 調試:DEBUG(500),對應Logger.debug方法
- 跟蹤:TRACE(600),對應Logger.trace方法
- 全部:ALL(Integer.MAX_VALUE)