質問

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

次のようなことができるようにしたい:

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

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

役に立ちましたか?

解決

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

他のヒント

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

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

および起動時...

java -Dlog_level=$LOG_LEVEL your_app

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

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

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

システム変数を作成します。このような変数には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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top