AI エージェント向け: ドキュメントインデックスは https://www.mongodb.com/ja-jp/docs/llms.txt で利用できます。すべてのページの markdown バージョンは、いずれかの URL パスに .md を追加することで利用できます。
Docs Menu

ログ記録

このガイドでは、次の方法を学習します。

  • 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/SSL

  • org.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/SSL

  • org.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ファイルに挿入します。

<?xml version="1.0" encoding="UTF-8"?>
<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インスタンスにロギング設定を適用できます。

次の表では、ロガー設定に連鎖させて、ログの動作を変更できる方法について説明します。

方式
説明

maxDocumentLength()

1 つのログメッセージの最大ドキュメント長(文字数)を設定

デフォルト:1000

この例では、リクエストを送信するアプリケーションに名前を付け、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ドキュメント 」を参照してください。