如何在MongoDB C#Driver 2.0中记录我的查询?

Sha*_*hay 5 c# logging mongodb mongodb-csharp-2.0 mongodb-.net-driver

刚刚将我的应用程序升级到最新的稳定的MongoDB C#Driver 2.0.

在迁移过程中,基本功能已被破坏,甚至最简单的查询如下:this.collection.Find(e => e.Id == id).SingleOrDefaultAsync()不返回正确的数据.

检查了类映射和约定,但我希望看到输出查询以正确识别问题.

那么,如何做到这一点MongoClient呢?

在数据库级别设置分析是可能的,但不是一个好的解决方案,因为我们有几个应用程序和开发人员使用数据库.

我的应用程序是目前正在使用Ninject.Extensions.Logging,并log4net在用户界面,业务和EF数据访问.

Ram*_*ein 9

对于较新的C#MongoDB驱动程序,API已更改.您必须使用接受MongoClientSettings对象的更复杂的构造函数,而不是连接字符串.

使用以下代码继续使用连接字符串,但启用每个命令的日志记录:

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);
Run Code Online (Sandbox Code Playgroud)


小智 6

使用 2.7.3 驱动程序记录到 VS 输出。

using MongoDB.Bson;
using MongoDB.Driver;
using System;
#if TRACE
using System.Diagnostics;
using MongoDB.Driver.Core.Configuration;
#endif

...

public static ClusterBuilder ConfigureCluster(ClusterBuilder builder)
{
#if TRACE
    var traceSource = new TraceSource(nameof(Geotagging), SourceLevels.Verbose);
    builder.TraceWith(traceSource);
    builder.TraceCommandsWith(traceSource);
#endif
    return builder;
}

public MongoClient BuildMongoClient(string connection_string)
{
    var mongoUrlBuilder = new MongoUrlBuilder(connection_string);
    var settings = MongoClientSettings.FromUrl(mongoUrlBuilder.ToMongoUrl());
    settings.ClusterConfigurator = cb => ConfigureCluster(cb);
    return new MongoClient(settings);
}
Run Code Online (Sandbox Code Playgroud)


sel*_*ary 5

您可以通过 mongo 驱动程序本身启用日志记录

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

如果您愿意,您可以将其连接到 log4net。