web-dev-qa-db-ja.com

Log4j2構成ファイルをプログラムで読み込む

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);

しかし、まだ何も機能しません。

32
HashimR

自分で答えを見つけました。誰かが役に立つかもしれません。

ConfigurationSource source = new ConfigurationSource();
source.setLocation(logConfigurationFile);
source.setFile(new File(logConfigurationFile));
source.setInputStream(new FileInputStream(logConfigurationFile));
Configurator.initialize(null, source);
15
HashimR

Log4jの最新バージョンの場合、外部log4j2.xml

String log4jConfigFile = System.getProperty("user.dir") + File.separator + "log4j2.xml";
ConfigurationSource source = new ConfigurationSource(new FileInputStream(log4jConfigFile));
Configurator.initialize(null, source);
37
switch_java3

メインエントリポイントが1つしかない場合、このコードスニペットを使用すると問題が軽減される場合があります。ロガーを作成する前に、プロパティの設定呼び出しを実行する必要があります。このアプローチは、クラスパス上のファイルで機能します。

public class TestProcess {
    static {
        System.setProperty("log4j.configurationFile", "log4j-alternate.xml");
    }

    private static final Logger log = LoggerFactory.getLogger(TestProcess.class);

}
18
dcompiled

以下は私のために働いた、Log4j2 SLF4J wrapper:

解決策1:

_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(...)
    }

}
_

解決策2:

_static {
    File log4j2File = new File("C:/path/to/log4j2.xml");
    System.setProperty("log4j2.configurationFile", log4j2File.toURI().toString());
}
_

ファイルURIスキーム形式 に従うにはtoURI()が必要です。それ以外の場合はMalformedURLExceptionをスローします。

出典:

5
silver

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>

カスタムLogContextListenercontextInitializedを上書きし、構成の場所を設定します

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にアクセスできることです。

3
lanoxx

検討中- https://logging.Apache.org/log4j/2.x/log4j-core/apidocs/org/Apache/logging/log4j/core/config/Configurator.html

Configurator.initialize(null, "classpath:conf/logger.xml");
or
Configurator.initialize(null, "/full_path/conf/logger.xml");

注意して、両方を同時に使用しないでください。

2
myset
final URL log4j = Resources.getResource("log4j2-test.xml");
LoggerContext.getContext(false)
  .start(new XmlConfiguration(new ConfigurationSource(
    Resources.asByteSource(log4j).openStream(),
    log4j)));
1
TJR