25 ロギング
Ratpackには、お気に入りのロギングライブラリをコンパイル時に簡単にバインドできるSLF4Jがロギングに使用されています。
ライブラリオプションには、次のものがあります。
- No-Op - すべてのログを破棄(デフォルト)
- Log4J
Log4Jでは、次のようにすべてのロガーを非同期にすることで、完全な非ブロッキング構成ができます。非同期ロガーとしてすべてのロガーを作成。これを実現する最も一般的な方法は、システムプロパティ
-Dlog4j2.contextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
を提供することです。Log4Jシステムプロパティは、アプリケーションのクラスパスで使用可能なlog4j2.component.properties
ファイルで定義することもできます。このプロパティを設定する前に、トレードオフを注意深く読んでください。ログ4Jでは、同期ロガーと非同期ロガーの混在構成も可能です。 - Logback - 「メモリーと計算オーバーヘッドゼロ」のSLF4Jネイティブ実装
Logbackでは、ブロッキングロガー周辺に非ブロッキングアペンダーが提供されています。それらを適切に構成する方法の詳細については、Logback マニュアルを参照してください。
- Javaユーティルロギング
- Simple - INFOレベル以上のメッセージをSystem.errにログに記録
- Jakarta Commonsロギング
1つのロギングライブラリを依存関係として追加し、SLF4J構文を使用してログに記録するだけです。現在別のロギングライブラリを使用している場合は、SLF4Jには移行を自動化する移行ツールが用意されています。
JavaとGroovyの例を以下に示し、詳細をSLF4Jマニュアルで見つけることができます。
1.25 Java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogExample {
private final static Logger LOGGER = LoggerFactory.getLogger(LogExample.class);
public void log() {
LOGGER.info("Start logging");
LOGGER.warn("Logging with a {} or {}", "parameter", "two");
LOGGER.error("Log an exception", new Exception("Example exception"));
LOGGER.info("Stop logging");
}
}
2.25 Groovy
import groovy.util.logging.Slf4j
@Slf4j
class LogExample {
void log() {
log.info "Start logging"
log.warn "Logging with a {} or {}", "parameter", "two"
log.debug "Detailed information"
log.info "Stop logging"
}
}
3.25 リクエストロギング
Ratpackでは、各リクエストに関する情報をログに記録するメカニズムRequestLogger
が提供されています。リクエストロガーはハンドラーです。リクエストを完了すると、それを処理する各リクエストがログに記録されます。一般的に、ハンドラーチェーンの早い段階に配置され、Chain.all(Handler)
メソッドで追加されて、すべてのリクエストがログに記録されます。
Ratpackでは、NCSA Common Log Formaでログに記録するRequestLogger.ncsa()
メソッドが用意されています。この実装は、ratpack.requests
という名前のslf4jロガーにログに記録します(RequestLogger.ncsa(Logger)
メソッドでは、代替ロガーを指定できます)。
import ratpack.core.handling.RequestLogger;
import ratpack.core.http.client.ReceivedResponse;
import ratpack.test.embed.EmbeddedApp;
import static org.junit.jupiter.api.Assertions.*;
public class Example {
public static void main(String... args) throws Exception {
EmbeddedApp.fromHandlers(c -> c
.all(RequestLogger.ncsa())
.all(ctx -> ctx.render("ok"))
).test(httpClient -> {
ReceivedResponse response = httpClient.get();
assertEquals("ok", response.getBody().getText());
// Check log output: [ratpack-compute-1-1] INFO ratpack.requests - 127.0.0.1 - - [30/Jun/2015:11:01:18 -0500] "GET / HTTP/1.1" 200 2
});
}
}
代替形式を使用してロガーを作成する情報については、RequestLogger
のドキュメントを参照してください。