今天我有一個問題,正確地重新配置log4j2配置。爲了解釋這個問題,我創建了一個與我們的生產代碼幾乎相匹配的示例應用程序示例項目的結構示於以下圖:如何以編程方式替換默認的log4j2配置?
對於顯影劑目的,我們要開始與包裝類的主應用程序來配置像記錄其不應該被放置在配置或系統性能的一些參數生產代碼。因此,生產者log4j2配置應該由開發者替換,以便將日誌級別設置得更具體,並避免日誌條目附加文件。以下是對生產主類代碼:
package logging.log4j2;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MainApp {
private final Log LOG = LogFactory.getLog(MainApp.class);
private final String[] commandLineArgs;
public static void main(String[] args) {
MainApp app = new MainApp(args);
app.start();
}
protected MainApp(String[] args) {
commandLineArgs = args;
}
public void start() {
LOG.info("Starting MainApp application ...");
// ... do main application stuff here
LOG.debug("This is only for DEBUG mode.");
}
}
現在爲開發商包裝主類代碼:
package logging.log4j2;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import java.net.URL;
public class DevWrapperMainApp extends MainApp {
private static final Log LOG = LogFactory.getLog(DevWrapperMainApp.class);
public static final String PROP_LOG4J_CONFIGURATION_FILE = "log4j.configurationFile";
protected DevWrapperMainApp(String[] args) {
super(args);
}
public static void main(String[] args) {
preconfigureDevMode();
DevWrapperMainApp devApp = new DevWrapperMainApp(args);
devApp.start();
}
private static void preconfigureDevMode() {
LOG.debug("Preconfigure application for deveoper mode ...");
String log4j2ConfigFilePath = System.getProperty(PROP_LOG4J_CONFIGURATION_FILE);
if(log4j2ConfigFilePath == null || log4j2ConfigFilePath.isEmpty()) {
URL configResource = DevWrapperMainApp.class.getResource("/dev-log4j2.xml");
if(configResource != null) {
System.setProperty(PROP_LOG4J_CONFIGURATION_FILE, configResource.toExternalForm());
} else {
LOG.error("Set log4j2 configuration file property failed. Resource file could not be detected correctly.");
}
}
}
}
生產應用程序的日誌記錄是由log4j2.xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="productiveConfig" status="WARN" monitorInterval="5">
<properties>
<property name="log.pattern.layout">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${sys:log.pattern.layout}"/>
</Console>
</Appenders>
<Loggers>
<Root level="INFO">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
對於示例應用程序沒有文件appender,但日誌記錄級別和配置名稱是differe NT從以下DEV-log4j2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration name="developerConfig" status="DEBUG" monitorInterval="5">
<properties>
<property name="log.pattern.layout">DEV-MODE: %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</property>
</properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${sys:log.pattern.layout}"/>
</Console>
</Appenders>
<Loggers>
<Root level="DEBUG">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
通過運行DevWrapperMainApp類我得到以下輸出:
"C:\Program Files\Java\jdk1.8.0_66\bin\java" ...
11:40:14.553 [main] INFO logging.log4j2.MainApp - Starting MainApp application ...
Process finished with exit code 0
除了INFO記錄我的預期輸出DEBUG也是如此。因此,通過覆蓋當前的系統屬性,日誌配置似乎不會被重新配置。也許是晚了,log4j2已經由生產配置文件配置好了嗎?如何在我的應用程序啓動時更改整個配置?文檔說:
但是,如果在調用Configurator.initialize()之前嘗試執行任何日誌記錄,那麼默認配置將用於這些日誌事件。 (部分:Reconfigure Log4j Using ConfigurationBuilder with the Configurator
也許有人對我在正確的方向去,我也知道有可能創建一個log4j2-的test.xml爲發展目的,而是想避免這種情況的提示和還預先設置的系統屬性。該代碼應該知道在哪裏可以找到的配置文件。
感謝。
哈迪