最近、アプリケーションログレベルが動的に変化する状況に遭遇しました。アプリケーション管理者は、フロントエンドからINFO / DEBUG/WARNに設定できます。選択したログレベルに基づいて、アプリケーションのログを変更する必要があります。
ロガーがこのシナリオをサポートしていることは確かですが、どうすればこれを達成できるかわかりません。あなたの誰かがこれについての考え/考えを持っているならば、私に知らせてください。
よろしくお願いします。
-ナレンドラ
slf4jでログレベルを動的に変更することはできませんが、log4jを含むslf4jの一部のバックエンドはそれをサポートしています。
この解決策は私のために働いた:
org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getRootLogger();
logger4j.setLevel(org.apache.log4j.Level.toLevel("ERROR"));
(出典: http: //prateep.info/2015/12/12/Dynamically-change-log-level-in-SLF4j-Log4J-with-Standalone-Java-Class/)
このソリューションの欠点は、バックエンドを直接使用することです。これは、slf4jの目的は、使用している特定のバックエンドから離れた抽象化を提供することであるため、slf4jを使用する場合は使用しないことになっています。
Logbackhttp://logback.qos.ch/を検討してください-「人気のあるlog4jプロジェクトの後継であり、log4jが中断したところを取り上げます」。指示された場合、logback-classicは構成ファイルの変更をスキャンし、構成ファイルが変更されたときに自動的に再構成します。さらに、JMXを使用してLogbackのログレベルを制御できます。
私はlog4jでこれを一度やらなければなりませんでした。それを行う方法を理解する唯一の方法は、LoggerオブジェクトでgetAllAppendersを呼び出すことでした。次に、アペンダーをループします。AppenderSkeletonクラスを拡張する場合(そうする必要があります)、setThresholdメソッドがあります。新しいレベルをパラメーターとしてこのメソッドを呼び出します。その後のロガーの呼び出しでは、新しいレベルを使用する必要があります。これにより、メモリ内のレベルが設定されますが、log4j構成ファイルには設定されません。管理者がフロントエンドを介してレベルを変更したときに自動的に変更されない限り、これも実行することをお勧めします。オプションの場合は、Evgeniy Dorofeevのアドバイスに従うことを検討し、ログバックを使用することをお勧めします。簡単そうですね。
SLF4Jの場合、このコードは、プログラムで(実行時に)ロガーレベルを制御する方法を示します。
この回答は、LogbackClassicを使用していることを前提としています。
デフォルトのSLF4J構成を想定しています。
final Logger logger = LoggerFactory.getLogger(LoggerListener.class);
// These five statements will log.
logger.error("error");
logger.warn("warn");
logger.info("info");
logger.debug("debug");
logger.trace("trace");
final ch.qos.logback.classic.Logger logger2 = (ch.qos.logback.classic.Logger) logger2;
@Nullable
final Level nullablePrevLevel = logger2.getLevel();
final Level level = Level.INFO;
logger2.setLevel(level);
logger.info("Change log level: [{}]->[{}]", nullablePrevLevel, level);
// These three statements will log.
logger.error("error");
logger.warn("warn");
logger.info("info");
// These two statements will not log.
logger.debug("debug");
logger.trace("trace");
slf4j
バージョンの時点で1.7.26
、ログレベルを変更することができました。
これがlogback.xml
ソースフォルダにあります。スプリングブートアプリの場合は、resourcesフォルダーに配置することをお勧めします。
<configuration scan="true" scanPeriod="20000">
<include file="C:/logback-ext.xml"/>
</configuration>
logback-ext.xml
ファイルは外部の場所に保存されます。はscanPeriod
ミリ秒単位です。これが失敗した場合は、include resource
の代わりにをinclude file
使用してみてくださいlogback.xml
。
<included>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss} %-5p [%t] --- %c{1}.%M:%L :: %m %n
</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</included>
ロギングレベル、ロギングパターンを変更し、新しいアペンダーをアタッチ/デタッチし、アペンダーを追加/削除することができました。
これらはの依存関係ですpom.xml
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
乾杯!