web-dev-qa-db-ja.com

Java Spring Boot)でlog4j2.xmlのデフォルトの場所を変更するにはどうすればよいですか?

Log4j2は、ドキュメントに記載されているとおり、ルートクラスパスのlog4j2.xml構成ファイルを介してSpring Bootとうまく連携しています。

ただし、このファイルを別の場所に移動しようとすると、起動時に新しい場所をSpringに渡すことができません。 ドキュメント から:

さまざまなロギングシステムは、クラスパスに適切なライブラリを含めることでアクティブ化でき、クラスパスのルートまたはSpring Environmentによって指定された場所に適切な構成ファイルを提供することでさらにカスタマイズできますプロパティlogging.config

Javaシステムプロパティで新しい場所を設定してみました

Java -jar -Dlogging.config="classpath:/config/log4j2.xml" target/app.jar

または、関連するプロパティを含む外部application.propertiesを使用する

logging.config=classpath:/config/log4j2.xml

しかし、次のエラーメッセージが定期的に表示されます。

ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
16
micpalmia

Springリファレンスドキュメント で指定されているように、logging.configプロパティは、ロギングがすでに初期化された後に読み取られるため、アプリケーションプロパティの中で設定することはできません。

解決策は、次のように外部ロギング構成へのパスを提供することです。

Java -Dlogging.config='/path/to/log4j2.xml' -jar app-current.jar
25
micpalmia

micpalmia の答えは完全に正しいです。

構成ファイルをパラメーターとして渡したくないクラスパスの外側に構成を配置する必要がありました。だから私はクラスパスリソースに非常に単純なログ設定を入れて、春のブートアプリケーションが開始時にログを再設定するようにしました、のように:

@SpringBootApplication
public class Application implements CommandLineRunner {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... param) throws UnsupportedEncodingException {
        Configurator.initialize(null, "config/log4j2.xml");
        // ...
    }
}

このアプローチには重大な欠点があります。アプリケーションの起動プロセス全体が外部で構成されたものとして記録されません。しかし、カスタムコードが実行されると、ロガーは意図したとおりに機能します。あなたはそうではないかもしれませんが、これは私が共存できる妥協案だと思います。

3
konqi

カスタムパスを設定したり、ログファイルの既存のファイルパスを変更したりするための実用的なソリューションがあります。 log4j2.xmlファイルを構成している場合は、それを開き、構成ログファイルのパスを1行変更する必要がある場所を確認します。 enter image description here

2
SachinVsSachin

Log4j2ドキュメント here で述べたように、log4j2.component.propertiesという名前のファイルをリソースフォルダー(またはクラスパスの任意の場所)に含めることができ、そのファイル内にファイルの名前を指定できます次のような場所(または新しいファイル名):

log4j.configurationFile=path/to/log4j2.xml

または

log4j.configurationFile=classpath:log4j2-custom.xml (if the file is on the classpath)

代わりに、前述のようにcontext-paramweb.xmlフィールドを使用して設定ファイルの場所を指定できます here ですが、そのオプションは試していません

(これはSpring Bootでも機能します)

1
Daud

私のプロジェクトにも同じ問題があります。log4j2.xmlの他に、クラスパスに他の構成ファイルも必要です。ここに私の2つの解決策があります:

解決策1:org.springframework.boot.loader.JarLauncherを使用してSpringブートアプリケーションを開始する

Java -classpath SpringBootProject.jar;./config org.springframework.boot.loader.JarLauncher

解決策2:jarのMANIFEST.MFに「./config」クラスパスエントリを書き込む

    <build>
    <plugins>
      <plugin>
        <artifactId>maven-jar-plugin</artifactId>
        <configuration>
          <archive>
            <manifestEntries>
               <Class-Path>./config/</Class-Path>
            </manifestEntries>
          </archive>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <version>1.5.3.RELEASE</version>
        <executions>
          <execution>
            <goals>
              <goal>repackage</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
1
Harry.Chen

プロパティファイルの場合:

Java -Dlog4j.configuration = file:/path/to/log4j.properties -jar app.jar

コマンドラインには、Spring Boot 2で機能します。パスの前にfile:を追加することを忘れないでください。

1
Atul