第一步,添加Nuget包引用 需要添加兩個Nuget包分別是:Microsoft.AspNetCore.MiddlewareAnalysis和Microsoft.Extensions.DiagnosticAdapter,前者是分析記錄中間件核心代碼實現後者是用來接收日誌輸出的,由於是用的Diagno ...
第一步,添加Nuget包引用
需要添加兩個Nuget包分別是:Microsoft.AspNetCore.MiddlewareAnalysis
和Microsoft.Extensions.DiagnosticAdapter
,前者是分析記錄中間件核心代碼實現後者是用來接收日誌輸出的,由於是用的DiagnosticSource方式記錄日誌,所以需要使用DiagnosticListener對象的SubscribeWithAdapter方法來訂閱。
第二步,實現一個分析診斷適配器
這個適配器是為了方便我們把從DiagnosticSource接收到的日誌對象輸出到控制台,具體代碼實現如下
public class AnalysisDiagnosticAdapter
{
private readonly ILogger<AnalysisDiagnosticAdapter> _logger;
public AnalysisDiagnosticAdapter(ILogger<AnalysisDiagnosticAdapter> logger)
{
_logger = logger;
}
[DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareStarting")]
public void OnMiddlewareStarting(HttpContext httpContext, string name, Guid instance, long timestamp)
{
_logger.LogInformation($"中間件-啟動: '{name}'; Request Path: '{httpContext.Request.Path}'");
}
[DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareException")]
public void OnMiddlewareException(Exception exception, HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
{
_logger.LogInformation($"中間件-異常: '{name}'; '{exception.Message}'");
}
[DiagnosticName("Microsoft.AspNetCore.MiddlewareAnalysis.MiddlewareFinished")]
public void OnMiddlewareFinished(HttpContext httpContext, string name, Guid instance, long timestamp, long duration)
{
_logger.LogInformation($"中間件-結束: 耗時[{duration/10000}] '{name}'; Status: '{httpContext.Response.StatusCode}'");
}
}
第三步,註冊相關服務來啟用分析中間件的功能
- 註冊中間件分析服務
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddMiddlewareAnalysis();
- 訂閱我們的分析診斷適配器
var listener = app.Services.GetRequiredService<DiagnosticListener>();
var observer = ActivatorUtilities.CreateInstance<AnalysisDiagnosticAdapter>(app.Services);
using var disposable = listener.SubscribeWithAdapter(observer);
這樣基本就完成了分析記錄中間件的功能,啟動程式看看效果
日誌已經成功的輸出到我們的控制台了,不過才四個中間件,應該不止這麼少的,再在註冊中間件分析服務哪裡添加一句代碼
var builder = WebApplication.CreateBuilder(args);
// 新增的下麵這句代碼
builder.Services.Insert(0, ServiceDescriptor.Transient<IStartupFilter, AnalysisStartupFilter>());
builder.Services.AddMiddlewareAnalysis();
現在再來看看效果,發現變成8個中間件了多了四個
在Release模式編譯後,運行發現中間件的執行效率非常高,幾乎不占用時間
異常記錄這裡就不放圖了,有興趣的朋友自己去試試。
簡單三步就可以知道一個請求到底執行了哪些中間件還是挺方便的。想知道實現原理可以去看看Microsoft.AspNetCore.MiddlewareAnalysis這個庫,一共才四個文件看起來不費事。