2010-12-11 4 views
12

でのlog4jのログレベルを変更することができ、私はlog4j.propertiesファイルで多くのことを試してみました、私はまた、書かれたコードにしようとしていました特定の時間が経過した後、再びプロパティファイルが読み込まれ、再度ロガーが設定されます。たちは、私は、実行時にlog4jのログレベルを変更したい、私は問題を持っているランタイム

が、問題は、私は1つのAPIコールのデバッグするために、その呼び出しが完了すると、その後、ロガーは再び以前の値に変更する必要がありますログレベルを変更したい、..です

助けてください..

答えて

16

希望するLevelLogger.setLevelメソッドを呼び出すと、実行時にLoggerの出力レベルを変更できます。

以下は、その使用法を示す例である:

Logger logger = Logger.getLogger("myLogger"); 
logger.addAppender(new ConsoleAppender(new SimpleLayout())); 

System.out.println("*** The current level will be INFO"); 

logger.setLevel(Level.INFO); 
logger.warn("Only INFO and higher will appear"); 
logger.info("Only INFO and higher will appear"); 
logger.debug("Only INFO and higher will appear"); 

System.out.println("*** Changing level to DEBUG"); 

// remember the previous level 
Level previousLevel = logger.getLevel(); 

logger.setLevel(Level.DEBUG); 
logger.warn("DEBUG and higher will appear"); 
logger.info("DEBUG and higher will appear"); 
logger.debug("DEBUG and higher will appear"); 

System.out.println("*** Changing level back to previous level"); 

// revert to previous level 
logger.setLevel(previousLevel); 
logger.warn("Only INFO and higher will appear"); 
logger.info("Only INFO and higher will appear"); 
logger.debug("Only INFO and higher will appear"); 

上記出力:

*** The current level will be INFO 
WARN - Only INFO and higher will appear 
INFO - Only INFO and higher will appear 
*** Changing level to DEBUG 
WARN - DEBUG and higher will appear 
INFO - DEBUG and higher will appear 
DEBUG - DEBUG and higher will appear 
*** Changing level back to previous level 
WARN - Only INFO and higher will appear 
INFO - Only INFO and higher will appear 

上記myLoggerという名前のLoggerのレベルを変更する方法を示したが、レベルは場合現在のリポジトリ内のすべてのロガーを変更する必要があります。ルートロガーのsetLevelメソッドLogger.getRootLogger sho uldを呼び出して、すべての子ロガーのレベルを変更します。

8

ロガーのログレベルは@coobirdによって記載されたようsetLevelを呼び出すことによって変更することができます。しかし、キャッチがあります!

getLogger(name)を呼び出すと、可能であれば、ログライブラリは既存のLoggerオブジェクトを返します。 2つ以上のスレッドが同じ名前のロガーを要求する場合、同じオブジェクトを取得します。いずれかのスレッドがsetLevelを呼び出すと、他のすべてのスレッドのロガーレベルが変更されます。予期しない動作につながる可能性があります。

あなたが本当にこういうことを行う必要がある場合は、より良いアプローチは、異なるレベルでログインしたい場合のために別の名前でロガーを作成することです。

しかし、私はすべてsetLevelを呼び出すアプリケーションの知恵の確信していません。 setLevelメソッドは、ログメッセージをフィルタリングすることについてのものであり、ユーザ/デプロイヤから離れたところにあるロギングフィルタリングの制御を奪うべきではありません。

1

私はそれは、サーバが「コントローラ」のスレッドを持っている場合setLevelを呼び出すことが理にかなっていると思います。こうすることで、実行時に動的にロギングレベルを変更して問題をデバッグし、完了した時点で変更することができます。

しかし、別のスレッドから呼び出されたときにどうなるかわかりません。

+0

これはコメントであり、答えではありません。コメントをするには、あなたが答えを知っている質問に答えてみてください! – durron597

-1

でsetLevelの方法があるだけjava.util.logging.Loggerのためではなくこれは、我々はApacheのlog4jのにログレベルを設定する方法ですorg.apache.logging.log4j.Logger

ため

org.apache.logging.log4j.core.LoggerContext 
ctx = (LoggerContext) LogManager.getContext(false); 
org.apache.logging.log4j.core.config.Configuration 
conf = ctx.getConfiguration(); 
conf.getLoggerConfig(LogManager.ROOT_LOGGER_NAME).setLevel(Level.DEBUG); 
ctx.updateLoggers(conf); 
関連する問題