閱讀944 返回首頁    go 阿裏雲 go 技術社區[雲棲]


《Log4j2官方文檔》自動加載配置

Log4j可以在初始化的時候執行自動配置。當Log4j啟動的時候,會首先定位所有的ConfigurationFactory的配置然後會根據權重進行從高到低的排序。目前的版本,Log4j包含了四種類型的ConfigurationFactory的實現,JSONYAMLpropertiesXML

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.

請注意,當使用默認配置的時候,其他狀態的日誌都被禁用了.

轉載自 並發編程網 - ifeve.com

最後更新:2017-05-19 11:01:45

  上一篇:go  《Log4j2官方文檔》從Log4j 1.x遷移
  下一篇:go  《Log4j2官方文檔》Appenders配置