Logging

Starting in 4.8, PyMongo supports Python’s native logging library, enabling developers to customize the verbosity of log messages for their applications.

Components

There are currently three different PyMongo components with logging support: pymongo.command, pymongo.connection, and pymongo.serverSelection. These components deal with command operations, connection management, and server selection, respectively. Each can be configured separately or they can all be configured together.

Configuration

Currently, the above components each support DEBUG logging. To enable a single component, do the following:

import logging
logging.getLogger('pymongo.<componentName>').setLevel(logging.DEBUG)

For example, to enable command logging:

import logging
logging.getLogger('pymongo.command').setLevel(logging.DEBUG)

You can also enable all DEBUG logs at once:

import logging
logging.getLogger('pymongo').setLevel(logging.DEBUG)

Truncation

When pymongo.command debug logs are enabled, every command sent to the server and every response sent back will be included as part of the logs. By default, these command and response documents are truncated after 1000 bytes.

You can configure a higher truncation limit by setting the MONGOB_LOG_MAX_DOCUMENT_LENGTH environment variable to your desired length.

Note that by default, only sensitive authentication command contents are redacted. All commands containing user data will be logged, including the actual contents of your queries. To prevent this behavior, set MONGOB_LOG_MAX_DOCUMENT_LENGTH to 0. This will omit the command and response bodies from the logs.

Example

Here’s a simple example that enables pymongo.command debug logs and performs two database operations:

import logging
import pymongo

# Automatically writes all logs to stdout
logging.basicConfig()
logging.getLogger('pymongo.command').setLevel(logging.DEBUG)

client = pymongo.MongoClient()
client.db.test.insert_one({"x": 1})
client.db.test.find_one({"x": 1})
---------------------------------
DEBUG:pymongo.command:{"clientId": {"$oid": "65cbe82614be1fc2beb4e4a9"}, "message": "Command started", "command": "{\"insert\": \"test\", \"ordered\": true, \"lsid\": {\"id\": {\"$binary\": {\"base64\": \"GI7ubVhPSsWd7+OwHEFx6Q==\", \"subType\": \"04\"}}}, \"$db\": \"db\", \"documents\": [{\"x\": 1, \"_id\": {\"$oid\": \"65cbe82614be1fc2beb4e4aa\"}}]}", "commandName": "insert", "databaseName": "db", "requestId": 1144108930, "operationId": 1144108930, "driverConnectionId": 1, "serverConnectionId": 3554, "serverHost": "localhost", "serverPort": 27017}
DEBUG:pymongo.command:{"clientId": {"$oid": "65cbe82614be1fc2beb4e4a9"}, "message": "Command succeeded", "durationMS": 0.515, "reply": "{\"n\": 1, \"ok\": 1.0}", "commandName": "insert", "databaseName": "db", "requestId": 1144108930, "operationId": 1144108930, "driverConnectionId": 1, "serverConnectionId": 3554, "serverHost": "localhost", "serverPort": 27017}
DEBUG:pymongo.command:{"clientId": {"$oid": "65cbe82614be1fc2beb4e4a9"}, "message": "Command started", "command": "{\"find\": \"test\", \"filter\": {\"x\": 1}, \"limit\": 1, \"singleBatch\": true, \"lsid\": {\"id\": {\"$binary\": {\"base64\": \"GI7ubVhPSsWd7+OwHEFx6Q==\", \"subType\": \"04\"}}}, \"$db\": \"db\"}", "commandName": "find", "databaseName": "db", "requestId": 470211272, "operationId": 470211272, "driverConnectionId": 1, "serverConnectionId": 3554, "serverHost": "localhost", "serverPort": 27017}
DEBUG:pymongo.command:{"clientId": {"$oid": "65cbe82614be1fc2beb4e4a9"}, "message": "Command succeeded", "durationMS": 0.621, "reply": "{\"cursor\": {\"firstBatch\": [{\"_id\": {\"$oid\": \"65cbdf391a957ed280001417\"}, \"x\": 1}], \"ns\": \"db.test\"}, \"ok\": 1.0}", "commandName": "find", "databaseName": "db", "requestId": 470211272, "operationId": 470211272, "driverConnectionId": 1, "serverConnectionId": 3554, "serverHost": "localhost", "serverPort": 27017}