プロジェクトの stdout/stderr への Restlet のロギングを無効にし、org.restlet.ext.slf4j によって提供される SLF4J ファサードを介してすべての Restlet ロギングを転送したいだけです。これを行う簡単な方法はありますか?
6 に答える
最初に SLF4J を構成して、Restlet のすべての呼び出しを java.util.logging API にインターセプトし、代わりにそれらを SLF4J ファサードの API の呼び出しにマップする必要があります。@Brunoが指摘したように、クラスパスにjul-to-slf4j.jarを配置するだけでこれを行うことができます。
次に、SLF4J ファサードを構成して、その API 呼び出しをロギング実装に転送し、実際のログ メッセージ生成を行う必要があります。Logback ロギングの実装を使用するには、logback-classic.jarをクラスパスにドロップします。
最後に、選択したロギングの実装を構成する必要があります。Logback を使用している場合は、XML を使用して個々のロガーのログ レベルを調整できます。
私たちは Restlet で SLF4J を使用しており、SLF4J がすべての異なるロギング API を 1 つに統合する方法が本当に気に入っています。それは非常にうれしいです。
編集 2019 年 4 月 29 日: @NaftuliKay と @stempler からのコメントを必ず確認してください。Restlet は過去 10 年間で間違いなく変化しました!
これは、STDERR へのロギングを無効にし、ロギングを log4j に転送するために行ったことです。基本的には、すべてのレストレットのベースとなる基本クラスです。log4j ブリッジをインストールし、コンソール ハンドラを見つけて無効にします。私にとってはうまくいきますが、最善の解決策ではない可能性があるため、外部構成を必要としないより良い解決策があれば教えてください。
public class CommonRestlet extends Application {
static {
// Install logging bridge (JUL -> LOG4J)
SLF4JBridgeHandler.install();
// Disable annoying console logging of requests..
Logger logger = Logger.getLogger("org.restlet");
for (Handler handler : logger.getParent().getHandlers()) {
// Find the console handler
if (handler.getClass().equals(java.util.logging.ConsoleHandler.class)) {
// set level to SEVERE. We could disable it completely with
// a custom filter but this is good enough.
handler.setLevel(Level.SEVERE);
}
}
}
// Other common stuff here...
}
pom.xml の依存関係
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
次の方法で、迷惑な Restlet ログを無効にすることができました。
Component component = new Component();
// Disable damn log
component.setLogService(new org.restlet.service.LogService(false));
...
私はjul-to-slf4jブリッジを使用する傾向がありますが、 Restlet Wikiで説明されているように、他の構成を取得できます。
プログラムによる構成
Engine.setRestletLogLevel(Level.OFF);
詳細 : http://restlet.com/learn/guide/2.2/editions/jse/logging
バージョン 2.1 以降、Engine#setLogLevel(…) および setRestletLogLevel(…) 静的メソッドを使用してプログラムでログ レベルを変更できるようになりました。Request#loggable プロパティを設定するか、LogService#isLoggable(Request) メソッドをオーバーライドすることで、選択的な呼び出しログを有効にすることもできます。
ここに何か問題があるようです: org.restlet.ext.slf4j.jar、slf4j-api.jar、logback-core.jar、および logback-classic.jar がリンクされている場合は、ログを無効にするために必要なものがすべて揃っています。 sdout と stderr。それらに追加しないように、構成ファイル (logback.xml) を変更するだけです。
この構成では、restlet は slf4j を「ネイティブに」使用しており、通常の slf4j 構成が適用されます。
また、org.restlet.ext.slf4j.jar により、とにかくパフォーマンスに深刻な影響を与える jul-to-slf4j.jar が不要になります。