52

log4j xml構成ファイルで(Javaシステム・プロパティではなく)システム環境変数を参照できますか?

次のようなことができるようになりたいです。

<level value="${env.LOG_LEVEL}" />

システム環境変数からそれを取得するので、-D パラメーターを使用して非常に多くのものを渡す必要がなくなります。

4

5 に答える 5

53

私は最近それをやろうとしましたが、うまくいきませんでした。私がやったことは、起動時に変数を送信することです。$LOG_LEVEL という環境変数があるとします。

<level value="${log_level}" />

そして起動時...

java -Dlog_level=$LOG_LEVEL your_app
于 2008-10-14T14:52:57.307 に答える
28

この構文は 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>
于 2015-03-29T13:49:03.370 に答える
12

これはサポートされていないと思いますが、基本的には、環境変数を取り込むために次の 2 つのことを行うことができます。

  1. Log4J を構成する前に System.setProperty を使用する

  2. (あなたの)環境変数をランチャーのシステム プロパティに変換します

最初のオプションは、基本的にこれに要約されます。

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 など)。

于 2008-10-15T07:24:32.030 に答える
0

システム変数を作成します。そのような変数には 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>
于 2016-02-03T17:19:10.187 に答える