ただし、Log4j のデフォルトの初期化手順に依存している場合、configureAndWatch() を呼び出す機会はありません。構成に使用されたファイルさえ知りません (ファイルでさえない可能性があります)。
[1]と[2]で既に回答したいくつかの関連する質問を投稿したので、この回答は他の人の説明に基づいています。繰り返しますが、私は AspectJ を使用しています。
サンプル アプリケーション クラス:
import org.apache.log4j.Logger;
public class Log4jDemo {
private static Logger logger = Logger.getLogger("scrum-master.de");
public static void main(String[] args) throws InterruptedException {
while (true) {
logger.info("Log message");
Thread.sleep(2000);
}
}
}
デフォルトの URL をキャプチャし、次の URL に引き渡すアスペクトconfigureAndWatch
:
import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;
import org.apache.log4j.helpers.OptionConverter;
import org.apache.log4j.LogManager;
import org.apache.log4j.PropertyConfigurator;
import org.aspectj.lang.SoftException;
public aspect Log4jAspect {
after(URL defaultURL) returning :
within(LogManager) &&
cflow(staticinitialization(LogManager)) &&
call(* OptionConverter.selectAndConfigure(URL, ..)) &&
args(defaultURL, ..)
{
try {
PropertyConfigurator.configureAndWatch(new File(defaultURL.toURI()).getAbsolutePath(), 2000);
} catch (URISyntaxException e) {
throw new SoftException(e);
}
}
}
log4j.properties-Dlog4j.configDebug=true
で、出力チャネルをSystem.log
(Eclipse コンソールの黒色) からSystem.err
(赤色、ここでは表示されない) に前後に変更して、Eclipse でテストしたところ、うまく機能しました。ログ出力には、ファイルの変更が検出された後の再構成に関するデバッグ情報も表示されます。
log4j: Trying to find [log4j.xml] using context classloader sun.misc.Launcher$AppClassLoader@f4a24a.
log4j: Trying to find [log4j.xml] using sun.misc.Launcher$AppClassLoader@f4a24a class loader.
log4j: Trying to find [log4j.xml] using ClassLoader.getSystemResource().
log4j: Trying to find [log4j.properties] using context classloader sun.misc.Launcher$AppClassLoader@f4a24a.
log4j: Using URL [file:/C:/Dokumente%20und%20Einstellungen/Robin/Eigene%20Dateien/java-src/dummy2/bin/log4j.properties] for automatic log4j configuration.
log4j: Reading configuration from URL file:/C:/Dokumente%20und%20Einstellungen/Robin/Eigene%20Dateien/java-src/dummy2/bin/log4j.properties
log4j: Parsing for [root] with value=[debug, stdout].
log4j: Level token is [debug].
log4j: Category root set to DEBUG
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "stdout".
log4j: Setting property [target] to [System.err].
log4j: Parsed "stdout" options.
log4j: Finished configuring.
log4j: Parsing for [root] with value=[debug, stdout].
log4j: Level token is [debug].
log4j: Category root set to DEBUG
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "stdout".
log4j: Setting property [target] to [System.err].
log4j: Parsed "stdout" options.
log4j: Finished configuring.
17:48:20,944 INFO de:10 - Log message
17:48:22,944 INFO de:10 - Log message
17:48:24,944 INFO de:10 - Log message
17:48:26,944 INFO de:10 - Log message
log4j: Parsing for [root] with value=[debug, stdout].
log4j: Level token is [debug].
log4j: Category root set to DEBUG
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "stdout".
log4j: Setting property [target] to [System.out].
log4j: Parsed "stdout" options.
log4j: Finished configuring.
17:48:28,944 INFO de:10 - Log message
17:48:30,944 INFO de:10 - Log message
17:48:32,944 INFO de:10 - Log message
17:48:34,944 INFO de:10 - Log message
log4j: Parsing for [root] with value=[debug, stdout].
log4j: Level token is [debug].
log4j: Category root set to DEBUG
log4j: Parsing appender named "stdout".
log4j: Parsing layout options for "stdout".
log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p %c{1}:%L - %m%n].
log4j: End of parsing for "stdout".
log4j: Setting property [target] to [System.err].
log4j: Parsed "stdout" options.
log4j: Finished configuring.
17:48:36,944 INFO de:10 - Log message
17:48:38,944 INFO de:10 - Log message