《Log4j2官方文檔》自動加載配置
Log4j
可以在初始化的時候執行自動配置。當Log4j啟動的時候,會首先定位所有的ConfigurationFactory
的配置然後會根據權重進行從高到低的排序。目前的版本,Log4j
包含了四種類型的ConfigurationFactory
的實現,JSON
,YAML
,properties
,XML
。
1:Log4j
將會檢查 log4j.configurationFile
的係統屬性,如果已經設置了對應的屬性,將會使用ConfigurationFactory
對應的屬性去加載配置。
2:如果沒有設置對應的係統屬性,將會在classpath
中尋找log4j2-test.properties
文件。
3:如果沒有找到,則會在classpath
中繼續尋找log4j2-test.yaml
或者log4j2-test.yml
文件。
4:如果還是沒有找到,則會在classpath
中繼續尋找log4j2.json
或者log4j2-test.jsn
文件。
5:如果還是沒有找到,則會在classpath
中繼續尋找log4j2.xml
文件。
6:如果test文件不能classpath
中被定為,那麼就會尋找log4j2.properties
文件。
7:如果properties
文件不能被定位,就會在classpath
中尋找YAML
的配置文件,log4j2.yaml
或者log4j2.yml
文件。
8:如果YAML
文件不能被定位,就會在classpath
中尋找JSON
格式的配置文件,log4j2.json
或者log4j2.jsn
文件。
9:如果JSON
文件不能被定位,就會在classpath
中尋找XML
格式的配置文件,log4j2.xml
。
10:如果依然沒有配置文件被定位,那麼將會使用缺省的配置DefaultConfiguration
。日誌將會被直接輸出到控製台。
譯者附:設置log4j2的配置必然生效是哪個?就是他
log4j2-test.properties
。
例子應用MyApp
將會說明Log4j
是如何工作的。
import com.foo.Bar;
// Import log4j classes.
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class MyApp {
// Define a static logger variable so that it references the
// Logger instance named "MyApp".
private static final Logger logger = LogManager.getLogger(MyApp.class);
public static void main(final String... args) {
// Set up a simple configuration that logs on the console.
logger.trace("Entering application.");
Bar bar = new Bar();
if (!bar.doIt()) {
logger.error("Didn't do it.");
}
logger.trace("Exiting application.");
}
}
MyApp
首先引用log4j
的關聯類,然後定義了一個靜態的變量logger
,指定了logger
的名稱是MyApp.class
。
MyApp
使用的Bar
類,定義在com.foo
包的下麵。
package com.foo;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Bar {
static final Logger logger = LogManager.getLogger(Bar.class.getName());
public boolean doIt() {
logger.entry();
logger.error("Did it again!");
return logger.exit(false);
}
}
如果Log4j
無法定位配置文件,那麼就會使用缺省的配置。DafaultConfiguration
類定義了基本的配置,配置的內容:
ConsoleAppender
設置成root
。PatternLayout
的格式”%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} – %msg%n”
注意:缺省的Log4j
的日誌級別是LEVEL.ERROR
.
MyApp的日誌輸出
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] ERROR MyApp - Didn't do it.
按照前麵的描述,Log4j嚐試從配置文件中加載配置,一個缺省配置文件的內容大致如下:
<?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放到classpath中,就會得到和上麵一模一樣的輸出(因為這個和默認配置是一樣的)。
改變Root 的level為trace,日誌輸出就會變成下麵的樣子:
17:13:01.540 [main] TRACE MyApp - Entering application.
17:13:01.540 [main] TRACE com.foo.Bar - entry
17:13:01.540 [main] ERROR com.foo.Bar - Did it again!
17:13:01.540 [main] TRACE com.foo.Bar - exit with (false)
17:13:01.540 [main] ERROR MyApp - Didn't do it.
17:13:01.540 [main] TRACE MyApp - Exiting application.
請注意,當使用默認配置的時候,其他狀態的日誌都被禁用了.
最後更新:2017-05-19 11:01:45