【发布时间】:2020-06-20 16:30:49
【问题描述】:
我正在从事一个大学项目,我的导师要求我们记录所有内容,包括查询和执行时间。所以我努力寻找是否有任何可用的解决方案,但我没有找到。
编辑:我的项目是一个带有 Asp.net 核心和 mongo db(最新的 mongo 驱动程序)的 web api
【问题讨论】:
-
查看文档中的审计和分析。
我正在从事一个大学项目,我的导师要求我们记录所有内容,包括查询和执行时间。所以我努力寻找是否有任何可用的解决方案,但我没有找到。
编辑:我的项目是一个带有 Asp.net 核心和 mongo db(最新的 mongo 驱动程序)的 web api
【问题讨论】:
在服务器执行查询时记录查询:
https://www.mysoftkey.com/mongodb/profiling-for-slow-query-log-in-mongodb/
要在查询由特定客户端发出时记录查询,请使用命令监控。 .net 驱动文档:http://mongodb.github.io/mongo-csharp-driver/2.10/reference/driver_core/events/#command-events
似乎没有示例说明您从 .net 驱动程序中的这些事件中获得了什么。以下是在 Ruby 中使用等效功能的示例:https://docs.mongodb.com/ruby-driver/current/tutorials/ruby-driver-monitoring/#command-monitoring
【讨论】:
您可以订阅驱动程序的事件并记录它们。
public class Startup
{
...
public void ConfigureServices(IServiceCollection services)
{
...
services.AddSingleton<IMongoClient>(s =>
{
string connectionString = Configuration.GetConnectionString("MongoDb");
var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
settings.ClusterConfigurator = builder =>
{
var logger = s.GetRequiredService<ILogger<FileLogEvents>>();
builder.Subscribe(new FileLogEvents(logger));
};
return new MongoClient(settings);
});
}
}
public class FileLogEvents : IEventSubscriber
{
private readonly ILogger _logger;
private ReflectionEventSubscriber _subscriber;
public FileLogEvents(ILogger logger)
{
_logger = logger;
_subscriber = new ReflectionEventSubscriber(this);
}
public bool TryGetEventHandler<TEvent>(out Action<TEvent> handler)
{
return _subscriber.TryGetEventHandler(out handler);
}
public void Handle(CommandStartedEvent e)
{
_logger.LogInformation("Command Started: {Event}, Json: {Json}", e.CommandName, e.ToJson());
}
public void Handle(CommandSucceededEvent e)
{
_logger.LogInformation("Command Succeeded: {Event}", e.CommandName);
}
}
及Serilog配置示例
public class Program
{
public static void Main(string[] args)
{
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.WriteTo.Console()
.WriteTo.File("log.txt")
.CreateLogger();
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
【讨论】: