log4j xml構成ファイルで(Javaシステム・プロパティではなく)システム環境変数を参照できますか?
次のようなことができるようになりたいです。
<level value="${env.LOG_LEVEL}" />
システム環境変数からそれを取得するので、-D パラメーターを使用して非常に多くのものを渡す必要がなくなります。
log4j xml構成ファイルで(Javaシステム・プロパティではなく)システム環境変数を参照できますか?
次のようなことができるようになりたいです。
<level value="${env.LOG_LEVEL}" />
システム環境変数からそれを取得するので、-D パラメーターを使用して非常に多くのものを渡す必要がなくなります。
私は最近それをやろうとしましたが、うまくいきませんでした。私がやったことは、起動時に変数を送信することです。$LOG_LEVEL という環境変数があるとします。
<level value="${log_level}" />
そして起動時...
java -Dlog_level=$LOG_LEVEL your_app
この構文は log4j 2.X でのみ文書化されているため、正しいバージョンを使用していることを確認してください。1.X バージョンでは動作しません。
<Appenders>
<File name="file" fileName="${env:LOG_PATH}">
<PatternLayout>
<Pattern>%d %p %c{1.} [%t] %m %ex%n</Pattern>
</PatternLayout>
</File>
</Appenders>
これはサポートされていないと思いますが、基本的には、環境変数を取り込むために次の 2 つのことを行うことができます。
Log4J を構成する前に System.setProperty を使用する
(あなたの)環境変数をランチャーのシステム プロパティに変換します
最初のオプションは、基本的にこれに要約されます。
for (Map<String,String>.Entry entry : System.getenv().entrySet()) {
System.setProperty(entry.getKey(), entry.getValue());
}
...しかし、問題はもちろん、このコードをどこに置くかです。特に、ある種の Tomcat コンテナなどで実行している場合、これは面倒かもしれません。
もう 1 つは環境に大きく依存します。基本的に、アプリを起動するシェル スクリプトがある場合、シェル マジックを記述して、すべての環境変数をプロパティとして設定するか、必要なものだけを設定することができます。次に例を示します。
java -DMY_ENV=$MY_ENV -DMY_OTHER_ENV=$MY_OTHER_ENV -cp ... com.example.Main
これをサポートするためにサーバーの起動スクリプトを変更することもできます (例: catalina.sh など)。
システム変数を作成します。そのような変数には setenv.bat を使用することを好みます。
@echo off
rem app specific log dir
set "APP_LOG_ROOTDIR=../app/app-log"
exit /b 0
log4j.xml ファイルに参照を追加
<appender name="fileAppender" class="org.apache.log4j.RollingFileAppender">
<param name="Threshold" value="DEBUG" />
<param name="MaxFileSize" value="512KB" />
<param name="MaxBackupIndex" value="10" />
<param name="File" value="${APP_LOG_ROOTDIR}/app.log"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c{1} %m %n" />
</layout>
</appender>