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 のマニュアル を参照してください。
ロガー名
ロガーは、さまざまなログ イベントを整理するためにロガー名を使用します。ロガー名は階層を形成する文字列です。ロガーの名前の後に続く "." が他のロガーの名前のプレフィックスである場合、そのロガーは他のロガーの祖先です。例えば、"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 Management Extensions (JMX)
例 - 名前
この例では、特定のドライバー ロガーのログ レベルを変更する方法を説明しています。この例では、ルート ロガーを 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 の設定について詳しくは、公式 Logback 構成ガイドを参照してください。
例 - 設定する
この例では、ログ 4j ロガーを設定する方法を示します。
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 のデフォルトのログレベルは ERROR です。 Java Reactive Streams ドライバーで標準操作を実行しても、未構成の場合 Log j からの出力は生成されません。 Log4 j2 ロガーのログレベルを変更する方法については、4 2このページの「ロガーの構成」セクションの例 を参照してください。
Log4 j2 の詳細については、 Log4 j2 マニュアルを参照してください。
ロガーを構成する
ロガーを構成するには、SLF4J にバインドされたロギング フレームワークの構成システムを使用する必要があります。
次の例は、ロギング フレームワークの構成システムを使用してロガーのログレベルを設定する方法を示しています。
ロガーのログ レベルは、ロガーがメッセージを出力するのに必要なメッセージの緊急度の下限を指定します。
ロガー名
ロガーは、さまざまなログ イベントを整理するためにロガー名を使用します。ロガー名は階層を形成する文字列です。ロガーの名前の後に続く "." が他のロガーの名前のプレフィックスである場合、そのロガーは他のロガーの祖先です。例えば、"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 Management Extensions (JMX)
例 - 名前
この例では、特定のドライバー ロガーのログ レベルを変更する方法を説明しています。この例では、ルート ロガーを 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>
詳細情報
Log4 j2 の設定について詳しくは、 Log4 j2 構成ガイド を参照してください。
接続設定
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ドキュメント 」を参照してください。