How do I log my queries in MongoDB C# Driver 2.0?

Shay picture Shay · May 19, 2015 · Viewed 9.1k times · Source

Just upgraded my application to the latest stable MongoDB C# Driver 2.0.

During the migration, basic functionality has been broken and even the simplest query like: this.collection.Find(e => e.Id == id).SingleOrDefaultAsync() doesn't return the correct data.

Checked the class mappings and conventions but I would like to see the output query in order to properly identify the issue.

So, how should it be done on the MongoClient side?

Setting profiling on the database level is possible but not a good solution since we have several applications and developers using the database.

My application is currently using Ninject.Extensions.Logging and log4net in the UI, business and EF data access.

Answer

Ramon de Klein picture Ramon de Klein · Aug 4, 2017

For newer C# MongoDB drivers the API has changed. You have to use the more complex constructor that accepts a MongoClientSettings object, instead of the connection string.

Use the following code to keep using a connection string, but enable the logging of each command:

var mongoConnectionUrl = new MongoUrl(connectionString);
var mongoClientSettings = MongoClientSettings.FromUrl(mongoConnectionUrl);
mongoClientSettings.ClusterConfigurator = cb => {
    cb.Subscribe<CommandStartedEvent>(e => {
        logger.Log($"{e.CommandName} - {e.Command.ToJson()}");
    });
};
var mongoCfgClient = new MongoClient(mongoClientSettings);