Overview
このガイドでは、次の方法を学習します。
Simple Logging Facade For Java (SLF4J)を使用してロガーを設定する
ロガーのログレベルを構成する
このガイドでは、ドライバーでイベントをレコード方法について説明しています。コード内でドライバーのアクティビティに関する情報を使用する方法については、「 監視ガイド 」を参照してください。
重要
プロジェクトリ アクター ライブラリ
このガイドでは、プロジェクト Reactive ライブラリを使用して、 Java Reactive Streams ドライバー メソッドによって返された Publisher インスタンスを消費します。Project Reactive ライブラリとその使用方法の詳細については、React ドキュメントの使用開始を参照してください。
ロガーを設定する
このセクションでは、ロガーを設定するために必要な依存関係の背景を説明し、ロガーの設定例を示します。
バックグラウンド
Java Reactive Streams ドライバーは、Simple Logging Facade For Java (SLF4 J)を使用します。 SLF4 J を使用して、配置時に選択したロギングフレームワークを指定できます。 SLF4 J の詳細については、 SLF4 J のドキュメントを参照してください。
ロガーの設定はオプションです。アプリケーションを起動すると、 Java Reactive Streams ドライバーはクラスパス内の slf4j-api アーティファクトを検索します。ドライバーが slf4j-api アーティファクトを見つけられない場合、ドライバーは java.util.logging を使用して次の警告をログに記録し、それ以降のすべてのログ記録を無効にします。
WARNING: SLF4J not found on the classpath. Logging is disabled for the 'org.mongodb.driver' component
ロガーを設定するには、プロジェクトに以下を含める必要があります。
slf4j-apiアーティファクトロギング フレームワーク
バインディング
注意
最も一般的なロギング フレームワークでは、多くの場合、slf4j-api とロギング フレームワークを依存関係としてリストする単一のバインディング アーティファクトが存在します。つまり、プロジェクトの依存関係リストに 1 つのアーティファクトを追加することでロガーを設定できます。以下の例でこれを確認できます。
バインディングは、slf4j-api アーティファクトを ロギングフレームワークに接続するコードです。ロガーを設定および構成する方法については、タブを選択してください。
例 - 設定する
この例では、Logback ロガーを設定する方法を示します。
Tip
依存関係バージョン
以下のバージョンは真実のソースではなく、説明のためのものです。最新バージョン情報が保証されているかどうかについては、SLF4J および選択したログ記録フレームワークの公式ドキュメントを確認してください。
ビルド ツールに基づいて Maven または Gradle の指示を選択します。
Maven
次の依存関係をpom.xmlファイルに追加します。
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> </dependencies>
Gradle
次の依存関係をbuild.gradleファイルに追加します。
dependencies { implementation 'ch.qos.logback:logback-classic:1.2.11' }
前述の依存関係を追加したら、 MongoDBインスタンスに接続し、次のコードを使用してドキュメントを取得します。
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
次のような出力が表示されます。
... 12:14:55.853 [main] DEBUG org.mongodb.driver.connection - Opened connection [connectionId{localValue:3, serverValue:3}] to <MongoDB hostname> 12:14:55.861 [main] DEBUG org.mongodb.driver.protocol.command - Command "find" started on database <database> using a connection with driver-generated ID 3 and server-generated ID 3 to <MongoDB hostname>. The request ID is 5. Command: {"find": "<collection>", "filter": {}, "limit": 1, "singleBatch": true, "$db": "<database>", "lsid": {"id": {"$binary": {"base64": "<_id>", "subType": "04"}}}, "$readPreference": {"mode": "primaryPreferred"}} 12:14:55.864 [main] DEBUG org.mongodb.driver.protocol.command - Command "find" succeeded in 4.34 ms using a connection with driver-generated ID 3 and server-generated ID 3 to <MongoDB hostname>. The request ID is 5. Command reply: {"cursor": {"id": 0, "ns": "<database>.<collection>", "firstBatch": []}, "ok": 1.0, "$clusterTime": {"clusterTime": {"$timestamp": {"t": 1673778535, "i": 1}}, "signature": {"hash": {"$binary": {"base64": "<_id>", "subType": "00"}}, "keyId": 0}}, "operationTime": {"$timestamp": {"t": 1673778535, "i": 1}}}
注意
デフォルトのログレベル
Logback のデフォルトのログ レベルは DEBUG です。Logback ロガーのログ レベルを変更する方法については、このページの「ロガーの構成」セクションの例を参照してください。
Logback の詳細については、Logback マニュアルを参照してください。
ロガーを構成する
ロガーを構成するには、SLF4J にバインドされたロギング フレームワークの構成システムを使用する必要があります。
次の例は、ロギング フレームワークの構成システムを使用してロガーのログレベルを設定する方法を示しています。
ロガーのログ レベルは、ロガーがメッセージを出力するのに必要なメッセージの緊急度の下限を指定します。
例 - 構成する
この例では、ロガーのログ レベルを INFO に設定する方法を示します。
logback.xml という名前のファイルに Logback の構成を指定します。logback.xml ファイルはクラスパスからアクセスできれば、特定の場所に作成する必要はありません。
Logbackフレームワークでは、緊急度の順に次のログレベルが定義されます。
エラー
WARN
INFO
DEBUG
TRACE
次のコードを logback.xmlファイルに挿入します。
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
ロガーが正常に構成されたかテストするには、次のコードを実行します。
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
次のような出力が表示されます。
... 1317 [cluster-ClusterId{value='<your cluster id>', description='null'}-<your connection uri>] INFO org.mongodb.driver.cluster - Discovered replica set primary <your connection uri> 1568 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<server value>}] to <your connection uri>
configuring Logback について詳しくは、 Logback のマニュアル を参照してください。
ロガー名
ロガーは、さまざまなログ イベントを整理するためにロガー名を使用します。ロガー名は階層を形成する string です。ロガーの名前の後に続く "." が他のロガーの名前のプレフィックスである場合、そのロガーは他のロガーの祖先です。例、"grandparent" は "grandparent.parent" の祖先であり、これは "grandparent.parent.child" の祖先です。
具体的な例として、コード内のロガー階層は次のようになります。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger_parent = LoggerFactory.getLogger("parent"); Logger logger_child = LoggerFactory.getLogger("parent.child");
ロガーは祖先のロガーのプロパティを継承し、独自のロガーを定義することができます。これは、Java のクラス継承に似ていると考えることができます。
Java Reactive Streams ドライバーは、ドライバー内のさまざまなログ イベントを整理するために、次のロガー名を定義します。
org.mongodb.driver.authenticator: 認証org.mongodb.driver.client:MongoClientインスタンスに関連するイベントorg.mongodb.driver.cluster: MongoDB配置のモニタリングorg.mongodb.driver.connection: 接続と接続プールorg.mongodb.driver.connection.tls: TLS/SSLorg.mongodb.driver.operation: 自動再試行に関連するログ記録を含む操作org.mongodb.driver.protocol.command: MongoDB配置に送信されたコマンドとそこから受信された応答org.mongodb.driver.uri: 接続文字列の解析org.mongodb.driver.management: Java管理拡張機能(JTX)
例 - 名前
この例では、特定のドライバー ロガーのログレベルを変更する方法を説明しています。この例では、ルート ロガーを OFF に設定し、org.mongodb.driver.connection ロガーを INFO に設定します。これにより、アプリケーションはMongoDBインスタンスへの接続に関連するメッセージのみをログに記録するようになります。
次のコードを logback.xmlファイルに挿入します。
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <logger name="org.mongodb.driver.connection" level="INFO" additivity="true"/> <root level="OFF"> <appender-ref ref="CONSOLE" /> </root> </configuration>
ロガーが正常に構成されたかテストするには、次のコードを実行します。
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
次のような出力が表示されます。
... 829 [cluster-rtt-ClusterId{value='<some value>', description='null'}-<your connection URI>] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:2, serverValue:<your server value>}] to <your connection uri> 977 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>
Logback の設定について詳しくは、公式構成ガイドを参照してください。
例 - 設定する
この例では、 Log4j ロガーを設定する方法を示します。
Tip
依存関係バージョン
以下のバージョンは真実のソースではなく、説明のためのものです。最新バージョン情報が保証されているかどうかについては、SLF4J および選択したログ記録フレームワークの公式ドキュメントを確認してください。
ビルド ツールに基づいて Maven または Gradle の指示を選択します。
Maven
次の依存関係をpom.xmlファイルに追加します。
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.1</version> </dependency> </dependencies>
Gradle
次の依存関係をbuild.gradleファイルに追加します。
dependencies { implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1' }
前述の依存関係を含めたら、次のコードを使用してエラーをログ。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger = LoggerFactory.getLogger("MyApp"); logger.error("Logging an Error");
次のような出力が表示されます。
12:35:00.438 [main] ERROR <my package path> - Logging an Error
注意
デフォルトのログレベル
Log4 j2 の詳細については、 Log4 j2 マニュアルを参照してください。
ロガーを構成する
ロガーを構成するには、SLF4J にバインドされたロギング フレームワークの構成システムを使用する必要があります。
次の例は、ロギング フレームワークの構成システムを使用してロガーのログレベルを設定する方法を示しています。
ロガーのログ レベルは、ロガーがメッセージを出力するのに必要なメッセージの緊急度の下限を指定します。
ロガー名
ロガーは、さまざまなログ イベントを整理するためにロガー名を使用します。ロガー名は階層を形成する string です。ロガーの名前の後に続く "." が他のロガーの名前のプレフィックスである場合、そのロガーは他のロガーの祖先です。例、"grandparent" は "grandparent.parent" の祖先であり、これは "grandparent.parent.child" の祖先です。
具体的な例として、コード内のロガー階層は次のようになります。
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger_parent = LoggerFactory.getLogger("parent"); Logger logger_child = LoggerFactory.getLogger("parent.child");
ロガーは祖先のロガーのプロパティを継承し、独自のロガーを定義することができます。これは、Java のクラス継承に似ていると考えることができます。
Java Reactive Streams ドライバーは、ドライバー内のさまざまなログ イベントを整理するために、次のロガー名を定義します。
org.mongodb.driver.authenticator: 認証org.mongodb.driver.client:MongoClientインスタンスに関連するイベントorg.mongodb.driver.cluster: MongoDB配置のモニタリングorg.mongodb.driver.connection: 接続と接続プールorg.mongodb.driver.connection.tls: TLS/SSLorg.mongodb.driver.operation: 自動再試行に関連するログ記録を含む操作org.mongodb.driver.protocol.command: MongoDB配置に送信されたコマンドとそこから受信された応答org.mongodb.driver.uri: 接続文字列の解析org.mongodb.driver.management: Java管理拡張機能(JTX)
例 - 名前
この例では、特定のドライバー ロガーのログレベルを変更する方法を説明しています。この例では、ルート ロガーを OFF に設定し、org.mongodb.driver.connection ロガーを INFO に設定します。これにより、アプリケーションはMongoDBインスタンスへの接続に関連するメッセージのみをログに記録するようになります。
次のコードを log4j2.xmlファイルに挿入します。
<Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Logger name="org.mongodb.driver.connection" level="INFO"/> <Root level="OFF"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
ロガーが正常に構成されたかテストするには、次のコードを実行します。
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
次のような出力が表示されます。
... 15:40:23.005 [cluster-ClusterId{value='<some value>', description='null'}-<your connection uri>] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:3, serverValue:<your server value>}] to <your connection uri> 15:40:23.159 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>
詳細情報
Log4j2 の構成について詳しくは、公式の Log4j2 configuration guide を参照してください。
接続設定
applyToLoggerSettings() メソッドと applicationName() メソッドを使用して、MongoClientインスタンスにロギング設定を適用できます。
次の表では、ロガー設定に連鎖させて、ログの動作を変更できる方法について説明します。
方式 | 説明 |
|---|---|
| 1 つのログメッセージの最大ドキュメント長(文字数)を設定 デフォルト: |
例
この例では、リクエストを送信するアプリケーションに名前を付け、1 つのログメッセージの最大文字数が 5000 文字であることを指定しています。
MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyConnectionString( new ConnectionString("<connection URI>")) .applicationName("<application name>") .applyToLoggerSettings(builder -> builder.maxDocumentLength(5000)) .build()); Flux.from(mongoClient.listDatabaseNames()) .doOnNext(System.out::println) .blockLast();
次のような出力が表示されます。
01:20:38.782 [main] INFO org.mongodb.driver.client -- MongoClient with metadata {"application": {"name": "<application name>"}, ..., loggerSettings=LoggerSettings{maxDocumentLength=5000}, ... timeoutMS=null} ... 01:20:41.022 [main] DEBUG org.mongodb.driver.protocol.command -- Command "listDatabases" succeeded ... Command reply: {"databases": [...], ...} 01:20:41.024 [main] DEBUG org.mongodb.driver.connection -- Connection checked in: address=<address>, driver-generated ID=6 myDb sample_airbnb sample_analytics ...
詳細情報
このセクションで説明されている接続設定の詳細については、「 MongoClientSettings.Builder APIドキュメント 」を参照してください。