Log4j2 XML構成ファイルをアプリケーションからプログラムでロードしたい。
これを試しました:
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
Configurator.initialize(null, source);
この:
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source);
ConfigurationFactory.setConfigurationFactory(factory);
しかし、まだ何も機能しません。
自分で答えを見つけました。誰かが役に立つかもしれません。
ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
Log4jの最新バージョンの場合、外部log4j2.xml
:
String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
メインエントリポイントが1つしかない場合、このコードスニペットを使用すると問題が軽減される場合があります。ロガーを作成する前に、プロパティの設定呼び出しを実行する必要があります。このアプローチは、クラスパス上のファイルで機能します。
public class TestProcess {
static {
System.setProperty("log4j.configurationFile", "log4j-alternate.xml");
}
private static final Logger log = LoggerFactory.getLogger(TestProcess.class);
}
以下は私のために働いた、Log4j2 SLF4J wrapper:
_public class MyClass {
static {
try {
InputStream inputStream = new FileInputStream("C:/path/to/log4j2.xml");
ConfigurationSource source = new ConfigurationSource(inputStream);
Configurator.initialize(null, source);
} catch (Exception ex) {
// Handle here
}
}
private static final Logger LOGGER = LoggerFactory.getLogger(MyClass.class); // LogManager if not using SLF4J
public void doSomething() {
LOGGER.info(...)
}
}
_
_static {
File log4j2File = new File("C:/path/to/log4j2.xml");
System.setProperty("log4j2.configurationFile", log4j2File.toURI().toString());
}
_
ファイルURIスキーム形式 に従うにはtoURI()
が必要です。それ以外の場合はMalformedURLException
をスローします。
出典:
Servlet 3.0 Web Applicationを使用している場合、Log4jServletContextListenerそして、以下を実行します。
Log4jServletContextListener
から拡張するカスタムLogContextListener
を作成し、web.xml
でセットアップし、自動初期化を無効にします。
<listener>
<listener-class>com.example.LogContextListener</listener-class>
</listener>
<context-param>
<param-name>isLog4jAutoInitializationDisabled</param-name>
<param-value>true</param-value>
</context-param>
カスタムLogContextListener
でcontextInitialized
を上書きし、構成の場所を設定します
public void contextInitialized(ServletContextEvent event) {
/* Some logic to calculate where the config file is saved. For
* example you can read an environment variable.
*/
String pathToConfigFile = ... + "/log4j2.xml";
Configurator.initialize(null, pathToConfigFile);
super.contextInitialized(event);
}
web.xml
で直接場所を設定することの利点は、追加情報に基づいてパスを計算し、クラスパスの外部にある場合でもlog4j2.xmlにアクセスできることです。
Configurator.initialize(null, "classpath:conf/logger.xml");
or
Configurator.initialize(null, "/full_path/conf/logger.xml");
注意して、両方を同時に使用しないでください。
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
.start(new XmlConfiguration(new ConfigurationSource(
Resources.asByteSource(log4j).openStream(),
log4j)));