我想知道是否有一种优雅的方式将作用域属性添加到Application Insights,类似于Serilog
:
var yearEnricher = new PropertyEnricher("Year", year);
using (LogContext.PushProperties(yearEnricher))
{
// ...
}
在上一个示例中,using
块中创建的每个日志都会在其上标记Year
属性。
当我希望该属性出现在整个请求管道中时,我想出了如何执行此操作:
var requestTelemetry = context.Features.Get<RequestTelemetry>();
requestTelemetry?.Properties.Add(propertyName, propertyValue.ToString());
有时我想在与Web上下文无关的代码中创建日志记录范围,因此依赖IHttpContextAccessor
没有意义。我承认我可以利用OperationTelemetry
和TelemetryClient.StartOperation
来实现我的目标,但这很麻烦,因为我要实现一些我不感兴趣的属性(例如Name
,{ {1}},Success
...)。
有没有比依靠Duration
更好的方式?
答案 0 :(得分:1)
如果您不想使用OperationTelemetry
,可能需要考虑实施自己的ITelemetryInitializer
(请参阅文档here)。
实现类似堆栈的全局结构以保存要推送的属性并在Dispose
方法上弹出堆栈应该相当容易。
请注意,您可能需要使用CallContext
才能使您的堆栈成为线程安全的。