ILogger结构化日志参数转字符串调用何方法?BsonDocument日志异常
问题解析与解决方案
核心原因
.NET内置日志的**结构化占位符(如{Command})**和插值字符串的处理逻辑完全不同:
- 插值字符串
$"Executing MongoDB command: {command}"会直接调用BsonDocument.ToString(),输出的是MongoDB驱动定义的BSON格式字符串(比如{ "FieldName" : "Value" })。 - 而日志方法中使用
{Command}占位符时,默认日志格式化器会通过System.Text.Json将对象序列化为JSON,BsonDocument的JSON序列化结果和它自身ToString()的输出并不一致(比如会包含额外的类型标识,或者字段结构被调整)。
解决办法
如果希望结构化日志输出和ToString()结果一致,有两种简单方案:
- 手动调用ToString传入参数:直接把
command.ToString()作为日志参数传入,强制用BSON格式输出:logger.LogDebug("Executing MongoDB command: {Command}", command.ToString()); - 使用BsonDocument的ToJson方法(按需):如果需要JSON格式的输出而非BSON格式,可以调用
command.ToJson(),输出标准JSON字符串:logger.LogDebug("Executing MongoDB command: {Command}", command.ToJson());
如果必须让日志框架自动统一处理BsonDocument类型,可以自定义日志格式化器,但该方案配置复杂,仅适合大规模统一需求的场景。
内容的提问来源于stack exchange,提问作者Ilya Chernomordik
相关产品推荐
相关产品推荐

