Navigation

Logging

Overview

This guide shows you how to configure the driver logger which is responsible for reporting events that occur while your application is running. You can set the logger level, specify logging settings for individual classes, and provide a custom logger implementation.

You should read this guide if you need to customize the default behavior of the driver logger or want to explore the information provided by the logger.

Log Levels

You can configure the driver to report logger messages at three different levels as shown in the following table.

Logger LevelDescription
debugThe most verbose logger level which shows all logger messages reported by the driver including those reported in the info and error levels.
infoInclude informational messages reported by the driver including those reported in the error level.
errorOnly include error messages reported by the driver. This is the default setting.

The following example demonstrates how to set the logger to the debug level:

const { MongoClient, Logger } = require("mongodb");

// Replace the following with your MongoDB deployment's connection string.
const uri =
  "mongodb+srv://<clusterUrl>/?replicaSet=rs&w=majority";

const client = new MongoClient(uri);

async function main(client) {
  // Set debug level
  Logger.setLevel("debug");

  const db = client.db("sample_mflix");

  // Run a sample command to produce logger messages
  await db.command({ isMaster: true });
}

This snippet should output a few lines of logging information that resemble the following:

[DEBUG-Db:63846] 1585699200000 executing command {"isMaster":true} against sample_mflix.$cmd with options [{"readPreference":{"mode":"primary"}}] {
  type: 'debug',
  message: 'executing command {"isMaster":true} against sample_mflix.$cmd with options [{"readPreference":{"mode":"primary"}}]',
  className: 'Db',
  ...,
}
[DEBUG-Server:63846] 1585699200000 executing command [{"ns":"sample_mflix.$cmd","cmd":{"isMaster":true},"options":{}}] against myClusterHostname:27017:27017 {
  ...
}
[DEBUG-Server:63846] 11585699200000 executing command
[{"ns":"admin.$cmd","cmd":{"endSessions":[{"id":"DQLUQ1/LRKOYMy2CD13iLQ=="}]},"options":{}}] against myClusterHostname:27017 {
  ...
}

Filter on a Specific Class

You can set the Logger to only produce log messages generated by specific classes by defining a filter on it. The following example demonstrates how to apply a filter to log messages from the Db class only.

  // Set debug level
  Logger.setLevel("debug");

  // Only log statements on "Db" class
  Logger.filter("class", ["Db"]);

  const db = client.db("sample_mflix");

  // Execute command { isMaster: true } against db
  await db.command({ isMaster: true });
}

The logger output of the code above is similar to the prior example, but excludes logging from classes other than Db such as Server and resembles the following:

[DEBUG-Db:63846] 1585699200000 executing command {"isMaster":true} against sample_mflix.$cmd with options [{"readPreference":{"mode":"primary"}}] {
  type: 'debug',
  message: 'executing command {"isMaster":true} against sample_mflix.$cmd with options [{"readPreference":{"mode":"primary"}}]',
  className: 'Db',
  ...

You can specify any number of the following driver classes in the logging filter array to control what information is passed to the Logger:

Class nameDescription
DbInformation related to calls on a db instance
ServerInformation related to a server instance (standalone instance, mongos instance, or replica set member).
ReplSetInformation related to a replica set.
MongosInformation related to a mongos instance.
CursorInformation related to a cursor.
PoolInformation related to a connection pool.
ConnectionInformation related to a single-instance connection.
PingInformation related to a replica set ping operation.

You can add your own classes to the logger by creating your own logger instances as shown in the following sample code.

const { Logger } = require("mongodb");

class A {
  constructor() {
    this.logger = new Logger("A");
  }

  doSomething() {
    if (this.logger.isInfo()) {
      this.logger.info("logging A", {});
    }
  }
}

// Execute A to produce logging messages
const a = new A();
a.doSomething();

The logging message is triggered when doSomething() is called and is presented in the following format:

[INFO-A:65156] 1585699200000 logging A {
  type: 'info',
  message: 'logging A',
  className: 'A',
  ...
}

Custom Logger

You can configure the behavior and format of the messages reported by the logger by passing in a logger callback function which allows you to access and modify the message and metadata of the logger message.

The following example demonstrates how to define a logger callback function and add custom logic to it.

// Set debug level
Logger.setLevel("debug");

// Set our own logger
Logger.setCurrentLogger((msg, context) => {
  // Add your custom logic here
  context['foo'] = 'bar';
  msg = "Hello, World! " + msg;

  console.log(msg, context);
});

const db = client.db("sample_mflix");

// Run a command to produce logger messages
await db.command({ isMaster: true });

The code example above adds additional information in the callback function. The output of the example resembles the following:

Hello, World! [DEBUG-Db:65873] 1585699200000 executing command {"isMaster":true} against sample_mflix.$cmd with options [{"readPreference":{"mode":"primary"}}] {
  type: 'debug',
  message: 'executing command {"isMaster":true} against sample_mflix.$cmd with options [{"readPreference":{"mode":"primary"}}]',
  className: 'Db',
  foo: 'bar',
  ...
}

For more information on the methods available on the Logger, see the Logger API documentation.