2016-11-03 22 views
0

ロギングにlog4j2を使用するSpringブートアプリケーションがあります。私は実行時にロギングレベルを調整する必要があり、ロガー名とそれを設定する必要があるレベルを受け入れる単純なRESTfulインターフェイスでこれを行っています。私はまた、(特定のロガーだけで)ロギングレベルを永続的に変更できる必要があります。ログレベルを永続的に変更する方法を教えてください。

a)変更をlog4j設定ファイルに保存し直す方法はありますか?次回のアプリケーションの起動時にログレベルは以前の実行時に残っていますか?

b)設定ファイルに記載されているロガーのリストを読む方法はありますか?

を使用すると、設定ファイルを使用している場合a)に、サーバが起動するたびに、log4j2を構成するために使用されます

+1

データベースなどの何らかの種類の永続ストレージに書き出す必要があります。 – chrylis

+0

あなたの設定はあなたの戦争/耳のファイルに書かれているので、あなたはそれを書くことができません。コンテナはあなたに許されません。だから、@chrylisはコンテナ化されたアプリケーションには通常アクセス可能な永続ストアに格納する必要があると言います。 – markbernard

答えて

1

ありがとうございます。あなたは(容器の外側)に新しい設定ファイルを作成し、サーバーの起動時にlog4j2を設定するためにそれを使用することができます。

File file = new File("/config/new/log4j2.xml");    
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);  
    ctx.setConfigLocation(file.toURI()); 

それとも、新しい情報を保存し、log4jのにプログラム的

Bを変更する)このお試しください:

public Collection<Logger> getLoggers() 

https://logging.apache.org/log4j/2.0/log4j-core/apidocs/org/apache/logging/log4j/core/LoggerContext.html#getLoggers()

ここで(アプリケーションの起動時に実行される)コードの例は次のとおり

File file = new File(log4jConfigFilePath);  
    final LoggerContext ctx = (LoggerContext) LogManager.getContext(false); 
    ctx.setConfigLocation(file.toURI()); 

    Collection<org.apache.logging.log4j.core.Logger> collection = ctx.getLoggers();  
    System.out.println(collection.size()); // returns 0 (No loggers instantiated) 

    Logger logger = LoggerFactory.getLogger("myLogger"); 

    collection = ctx.getLoggers();  
    System.out.println(collection.size()); // returns 1 (myLogger instantiated) 
+0

ありがとう@マルコ。私のlog4j2設定ファイルはコンテナの外にあります。指定した手順に従って、設定ファイルにリストされている/設定されているロガーのリストを取得できませんでした。私がそのハードルを乗り越え、プログラムレベルでロガーレベルを変更できるようにした場合、変更を保存して設定ファイルに戻す方法はありますか? Thanks – spring5150

+0

getLoggers()は現在のロガーを返し、各インスタンスは設定ファイルにリストされているロガーの1つに属している必要があります。もちろん、LoggerFactory.getLogger(loggerName)を使用してインスタンスを作成しなかった場合、nullが返されます。残念ながら、log4j2 APIを使用してプログラマチックに行われた変更を維持する方法はありません。それを永続化する唯一の方法は、JavaのファイルI/O APIを使用して新しい設定ファイルを作成する(または現在のファイルを更新する)ことです。 –

+0

getLoggers()は設定ファイル内のロガーを返しません。私は通常のファイルI/Oと文字列解析を読んで解析する必要がありますか? Thanks – spring5150

関連する問題