我想在 MongoDB 中添加活动(用于日志记录)来跟踪 MongoDB 操作,特别是序列化/反序列化操作。
我使用官方 MongoDB 驱动程序:https://www.nuget.org/packages/mongodb.driver/
理想情况下,我搜索一种在所有序列化/反序列化操作上添加活动的方法,而无需更改 Mongodb.driver 的源代码,但这似乎......复杂......
对于某些类,我使用带有
RegisterClassMap
的自定义 ClassMap,如下所示:
BsonClassMap.RegisterClassMap<MyClasse>(cm =>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
});
如果我可以在这个班级中添加活动,那就足够了。
我发现了这个 nuggets 包,它提供了 MongoDB 操作的活动,但它没有封装序列化/反序列化时间。
如果有人有任何想法,我很乐意听取您的意见。 预先感谢
虽然 MongoDB C# 驱动程序本身不提供对如此细粒度级别的跟踪的内置支持,但您应该能够通过使用 .NET DiagnosticSource 框架检测代码来实现此目的。
这是实现这一目标的一种方法:
使用 DiagnosticSource 活动包装您的自定义类映射。您已经展示了如何使用自定义类映射、在这些方法中添加跟踪活动的示例:
BsonClassMap.RegisterClassMap<MyClasse>(cm =>
{
cm.AutoMap();
cm.SetIgnoreExtraElements(true);
// Wrap serialize and deserialize methods with DiagnosticSource activities
cm.MapMember(c => c.MyProperty)
.SetSerializer(SerializerBuilder.Build(typeof(MyPropertySerializer)));
});
这里,
SerializerBuilder.Build
应该是一个自定义序列化器,它将序列化和反序列化操作与DiagnosticSource活动包装起来。
然后为 MongoDB 操作创建您自己的 DiagnosticSource 事件并订阅这些事件以记录它们或执行其他操作。
using System.Diagnostics;
private static readonly DiagnosticSource mongoDbDiagnosticSource = new DiagnosticListener("MongoDBDiagnosticSource");
// Somewhere in your code, when you want to trace an operation:
var activity = new Activity("MongoDBSerialize");
activity.Start();
// Capture additional information if needed
activity.AddTag("CollectionName", "MyCollection");
mongoDbDiagnosticSource.Write(
"MongoDBSerialize.Start",
new { Activity = activity });
// ... Perform your MongoDB operation ...
activity.Stop();
mongoDbDiagnosticSource.Write("MongoDBSerialize.Stop", new { Activity = activity });
您需要为反序列化操作创建类似的工具。
您需要订阅您在代码中创建的
DiagnosticSource
事件来记录或分析跟踪信息。
var listener = new MyDiagnosticListener();
mongoDbDiagnosticSource.Subscribe(listener);
这里,
MyDiagnosticListener
是您将创建的自定义类,用于处理事件并执行日志记录等操作。
实施
MyDiagnosticListener
:
创建一个类来处理事件,您可以在其中记录跟踪信息或采取任何其他所需的操作。
public class MyDiagnosticListener
{
public void OnMongoDBSerializeStart(Activity activity)
{
// Log or process the start of MongoDB serialization
}
public void OnMongoDBSerializeStop(Activity activity)
{
// Log or process the end of MongoDB serialization
}
}
希望这可以帮助您了解如何捕获有关序列化/反序列化操作的详细信息并根据需要记录它们。
或者,您可以使用 .NET Core
ILogger
框架,例如 NLog
或 Serilog
来实现 MongoDB 操作的日志记录和跟踪。这样,您就可以提供一种将 MongoDB 操作日志记录与应用程序中现有日志记录基础设施集成的方法。