ログ記録
Overview
このガイドでは、MongoDB Java ドライバーでロガーを設定および構成する方法を学習できます。
次の方法を学習します:
Simple Logging Facade For Java(SLF4J)を使用してロガーを設定する
ロガーのログレベルを構成する
このガイドでは、ドライバーでイベントを記録する方法について説明しています。 コード内でドライバーのアクティビティに関する情報を使用する方法について学習したい場合は、監視に関するガイドをお読みください。
ロガーを設定する
このセクションでは、ロガーを設定するために必要な依存関係の背景を説明し、ロガーの設定例を示します。
バックグラウンド
MongoDB Javaドライバーは、Simple Logging Facade For Java (SLF4 J)を使用します。 SLF4 J を使用して、配置時に選択したロギングフレームワークを指定できます。 SLF4 J、 の詳細については、 SLF4 J のドキュメントを参照してください。
ロガーの設定はオプションです。アプリケーションを起動すると、MongoDB Java ドライバーはクラスパス内の 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
アーティファクトをロギング フレームワークに接続するコードです。次の例は、slf4j-api
アーティファクトを 2 つの最も一般的なログ記録フレームワークである Log4j2 と Logback にバインドする方法を示しています。
例 - 設定する
この例では、ロガーを設定する方法を示します。プロジェクトで使用するログ記録フレームワークに対応するタブをクリックします。
Tip
依存関係バージョン
以下にリストされているバージョンは、真実のソースではなく、説明のためのものです。最新バージョン情報が保証されているかどうかについては、SLF4J および選択したログ記録フレームワークの公式ドキュメントを確認してください。
プロジェクトに使用しているビルド ツールを選択します。
次の依存関係を pom.xml
ファイルに追加します。
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> </dependencies>
次の依存関係を 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>); collection.find().first();
次のような出力が表示されます。
... 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 マニュアルを参照してください。
プロジェクトに使用しているビルド ツールを選択します。
次の依存関係を pom.xml
ファイルに追加します。
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.1</version> </dependency> </dependencies>
次の依存関係を 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
注意
デフォルトのログレベル
Log4J2 のデフォルトのログ レベルは ERROR です。つまり、MongoDB Java ドライバーで標準操作を実行しても、未構成の場合 Log4J2 から出力は生成されません。Log4J2 ロガーのログ レベルを変更する方法については、このページの「ロガーの構成」セクションの例を参照してください。
Log4j2 について詳しくは、Log4j2 のマニュアルを参照してください。
ロガーを構成する
ロガーを構成するには、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>); collection.find().first();
次のような出力が表示されます。
... 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 のマニュアルを参照してください。
log4j2.xml
という名前のファイルに Log4j2の構成を指定します。log4j2.xml
ファイルはクラスパスからアクセスできれば、特定の場所に作成する必要はありません。
Log4j2 フレームワークで定義されているログ レベルは、次の通りです。以下は、ログ レベルを緊急度の順に降順に並べたリストです。
致命的
エラー
WARN
INFO
DEBUG
TRACE
すべて
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> <Root level="INFO"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
ロガーが正常に構成されたかテストするには、次のコードを実行します。
MongoClient mongoClient = MongoClients.create(<connection uri>); MongoDatabase database = mongoClient.getDatabase(<database>); MongoCollection<Document> collection = database.getCollection(<collection>); collection.find().first();
次のような出力が表示されます。
... 10:14:57.633 [cluster-ClusterId{value=<your cluster id>, description='null'}-<your connection uri>] INFO org.mongodb.driver.cluster - Discovered replica set primary <your connection uri> 10:14:57.790 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>
Log4j2 の構成について詳しくは、公式の Log4j2 configuration guide を参照してください。
ロガー名
ロガーは、さまざまなログ イベントを整理するためにロガー名を使用します。ロガー名は階層を形成する文字列です。ロガーの名前の後に続く "."
が他のロガーの名前のプレフィックスである場合、そのロガーは他のロガーの祖先です。たとえば、"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 のクラス継承に似ていると考えることができます。
MongoDB Java ドライバーは、ドライバー内のさまざまなログ イベントを整理するために、次のロガー名を定義します。以下は、ドライバーで定義されているロガー名と、それに対応するログ イベントです。
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
: MongoDB配置に送信されたコマンドとそこから受信された応答org.mongodb.driver.uri
: 接続文字列の解析org.mongodb.driver.management
: JMX(Java Management Extensions)
例 - 名前
この例では、特定のドライバー ロガーのログ レベルを変更する方法を説明しています。ルート ロガーを 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>); collection.find().first();
次のような出力が表示されます。
... 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 構成ガイドを参照してください。
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>); collection.find().first();
次のような出力が表示されます。
... 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 を参照してください。