web-dev-qa-db-ja.com

log4j xml構成でシステム環境変数を使用する

Log4j xml構成ファイルでシステム環境変数(Javaシステムプロパティ)とは対照的に)を参照することは可能ですか?

私は次のようなことをしたいです:

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

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

47
Derek Lewis

この構文は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>
22
Shoham

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

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

そして起動時に...

Java -Dlog_level=$LOG_LEVEL your_app
48
Einar

これはサポートされていないと思いますが、基本的には環境変数を取り込むために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または同様のもの。

11
Martin Probst

次のように、envと変数名の間にコロンを入れる必要があります。

<level value="${env:LOG_LEVEL}" />
4
Daniel Estrada

システム変数を作成します。そのような変数には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>
0
tkolleh