如何在 MongoDB C# Driver 2.0 中记录我的查询?
How do I log my queries in MongoDB C# Driver 2.0?
刚刚将我的应用程序升级到最新的稳定 MongoDB C# 驱动程序 2.0。
在迁移过程中,基本功能已被破坏,即使是最简单的查询,如:this.collection.Find(e => e.Id == id).SingleOrDefaultAsync()
也没有 return 正确的数据。
检查了 class 映射和约定,但我想查看输出查询以便正确识别问题。
那么,MongoClient
这边应该怎么做呢?
在数据库级别设置分析是可能的,但不是一个好的解决方案,因为我们有多个应用程序和开发人员在使用该数据库。
我的应用程序当前在 UI、业务和 EF 数据访问中使用 Ninject.Extensions.Logging
和 log4net
。
您可以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));
}
};
如果您愿意,可以将其连接到 log4net。
对于较新的 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);
使用 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);
}
刚刚将我的应用程序升级到最新的稳定 MongoDB C# 驱动程序 2.0。
在迁移过程中,基本功能已被破坏,即使是最简单的查询,如:this.collection.Find(e => e.Id == id).SingleOrDefaultAsync()
也没有 return 正确的数据。
检查了 class 映射和约定,但我想查看输出查询以便正确识别问题。
那么,MongoClient
这边应该怎么做呢?
在数据库级别设置分析是可能的,但不是一个好的解决方案,因为我们有多个应用程序和开发人员在使用该数据库。
我的应用程序当前在 UI、业务和 EF 数据访问中使用 Ninject.Extensions.Logging
和 log4net
。
您可以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));
}
};
如果您愿意,可以将其连接到 log4net。
对于较新的 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);
使用 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);
}