
DiagnosticSource 是.NET 平台自带的诊断发布-订阅机制(发布者-监听者模式)的一部分。它允许代码组件以低耦合的方式发布诊断事件(如 HTTP 请求、数据库访问等),而外部监听者可以选择性订阅感兴趣的事件进行分析或追踪,而无需双方直接依赖于对方。
其典型作用包括:
using System.Diagnostics;
public class Calculator
{
private static readonly DiagnosticSource diagnosticSource = new DiagnosticListener("Sample.Calculator");
public int Add(int a, int b)
{
int result = a + b;
if (diagnosticSource.IsEnabled("Add"))
{
diagnosticSource.Write("Add", new { A = a, B = b, Result = result });
}
return result;
}
}
using System;
using System.Diagnostics;
public class DiagnosticListenerObserver : IObserver<DiagnosticListener>
{
public void OnNext(DiagnosticListener listener)
{
// 只关注名称为 "Sample.Calculator" 的 DiagnosticListener
if (listener.Name == "Sample.Calculator")
{
listener.Subscribe(new DiagnosticEventObserver());
}
}
public void OnError(Exception error) { }
public void OnCompleted() { }
}
public class DiagnosticEventObserver : IObserver<KeyValuePair<string, object>>
{
public void OnNext(KeyValuePair<string, object> value)
{
if (value.Key == "Add")
{
var payload = value.Value; // payload 是一个匿名对象
Console.WriteLine($"收到 Add 事件:{Newtonsoft.Json.JsonConvert.SerializeObject(payload)}");
}
}
public void OnError(Exception error) { }
public void OnCompleted() { }
}
class Program
{
static void Main()
{
// 注册监听 DiagnosticListener
var subscribe = DiagnosticListener.AllListeners.Subscribe(new DiagnosticListenerObserver());
var calculator = new Calculator();
int sum = calculator.Add(3, 5);
// 控制台将输出 Add 事件的详细信息
// 程序结束前可以取消监听(可选)
subscribe.Dispose();
}
}
DiagnosticSource 为 .NET 开发带来了极其灵活的诊断和可观测性方法,无论你在开发库、中间件,还是希望对应用做“无感入侵”监控,都能得心应手。当然,它对类型不可知与事件命名的依赖也有一定门槛,需要明确使用约定。结合示例代码,相信你已经能掌握其核心思想并应用于实际项目之中。希望本文能帮你更深入理解和实践 DiagnosticSource!如果你喜欢这样的技术分享,欢迎点赞、评论与交流~
参考资料: