Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 672
Shay Avatar asked May 19 '15 18:05

Shay


2 Answers

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);
like image 71
Ramon de Klein Avatar answered Sep 29 '22 12:09

Ramon de Klein


You can enable logging by the mongo driver itself:

var settings = new MongoClientSettings
{
    ClusterConfigurator = cb =>
    {
        var textWriter = TextWriter.Synchronized(new StreamWriter("mylogfile.txt"));
        cb.AddListener(new LogListener(textWriter));
    }
};

You can hook it up to log4net if you wish.

like image 31
seldary Avatar answered Sep 29 '22 12:09

seldary