2014-01-13 32 views
19

Log4j2 XML構成ファイルをアプリケーションからプログラムでロードします。Log4j2構成ファイルをプログラムでロードする

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

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

+0

... –

答えて

10

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

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

が、上記のコードでも失敗しています。あなたのプロジェクトにlog4j2 Web依存関係はありましたか?私のlog4j2.xmlはクラスパスの外にあり、@PostConstructメソッドを持つSpring Beanにロードしようとしています。 – ColinMc

+0

私のログXML設定ファイルがクラスパスの外にありました。 – HashimR

+0

アプリケーションはウェブアプリですか?私は、log4j2を抽象化するためにslf4jも使用していることを言及する必要があります。 – ColinMc

11

あなたは、単一のメインエントリポイントを持っている場合は、このコードスニペットは、あなたにいくつかの手間を省くことがあります。設定されたプロパティ呼び出しは、ロガーが作成される前に起動する必要があります。この方法は、クラスパス上のファイルで動作します。 log4jの最新版については

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

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

} 
+0

これは優れていました。コンストラクタでプロパティを設定しようとしていましたが、動作しませんでした。静的なブロックが解決されました。 – another

22

、ここでは外部log4j2.xmlをロードするために働くべきである:

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

単純に 'Configurator.initialize(null、" fileName ");' –

+1

はい@Conorが正しいことが必要です。ありがとう! –

1

あなたがLog4jServletContextListenerを使用することができますサーブレット3.0 Webアプリケーションを使用している場合次の操作を行います。

LogContextListenerからLog4jServletContextListenerまでのカスタムを書き、あなたに設定しますR 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> 

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

を設定LogContextListenerweb.xmlに直接場所を設定するよりも有利でパスを計算することができます ということですいくつかの追加情報に基づいて、あなたのクラスパスの外にあってもlog4j2.xmlにアクセスしてください。私は同じことをやろうとしている

それはあなたが使用しているlog4j2 APIおよびコアのバージョンを指定するために理にかなってlog4j2にリロード構成に導入されたすべての後方互換性のない変更を
0
final URL log4j = Resources.getResource("log4j2-test.xml"); 
LoggerContext.getContext(false) 
    .start(new XmlConfiguration(new ConfigurationSource(
    Resources.asByteSource(log4j).openStream(), 
    log4j))); 
+0

これはちょうどFYIです - テストするために "log4j2-test.xml"を使うことに注意してください。これがlog4j2のフォルダのいずれかにある場合は、 "log4j2.xml"を超えて使用します。私はあなたのコードを試していないが、私は前のコードスニペットでこの問題を抱えていた。私はlog4j2が最初に "log4j2-test.xml"を探してから "log4j2.xml" https:// loggingを探しているため、実行時にすべてが上書きされていると思って "log4j2-test.xml"を使っていました。 apache.org/log4j/2.0/manual/configuration.html#AutomaticConfiguration – adpro

関連する問題