背景对于每隔几毫秒发生一次的事件,最好每个事件的开销较低(小于一毫秒)。否则,对性能的影响将是显着的。记录事件意味着您正在向磁盘写入内容。如果磁盘不够快,您将丢失事件。除了记录事件本身之外,您还需要一个解决方案。了解每个事件的指标在处理大量事件时也无济于事。大多数时候,您只需要一些统计数据。所以你可以在进程本身获取统计信息,然后偶尔写一个事件来报告统计信息,这就是EventCounter会做的事情。代码实现下面是一个如何实现System.Diagnostics.Tracing.EventSource的示例。创建一个名为MinimalEventCounterSource.cs的新文件:EventSource{publicstaticreadonlyMinimalEventCounterSourceLog=newMinimalEventCounterSource();privateEventCounter_requestCounter;privateMinimalEventCounterSource()=>_requestCounter=newEventCounter("request-time",this){DisplayName="RequestProcessingTime",DisplayUnits="ms"};publicvoidRequest(stringurl,floatelapsedMilliseconds){控制台.WriteLine("url:"+url+"elapsedMilliseconds:"+elapsedMilliseconds);WriteEvent(1,url,elapsedMilliseconds);_requestCounter?.WriteMetric(elapsedMilliseconds);}protectedoverridevoidDispose(booldisposing){_requestCounter?.Dispose();_requestCounter=null;base.Dispose(disposing);}}}添加操作筛选器,创建名称LogRequestTimeFilterAttribute.cs包含以下代码:namespaceWebApplication42{publicclassLogRequestTimeFilterAttribute:ActionFilterAttribute{privatereadonlyStopwatch_stopwatch=newStopwatch();publicoverridevoidOnActionExecuting(ActionExecutingContextcontext)=>_stopwatch.Start();publicoverridevoidOnActionExecuted(ActionExecutedContextcontext){_stopwatch.Stop();MinimalEventCounterSource.Log.Request(context.HttUquest()Context),_stopwatch.ElapsedMilliseconds);}}}Action过滤器在请求开始时启动秒表并在请求完成后停止,捕获记录到MinimalEventCounterSource单例的总经过毫秒数。为了应用此过滤器,需要将其添加到过滤器集合中。在Startup.cs文件中,更新ConfigureServices方法以包含此筛选器。//Thismethodgetscalledbytheruntime.Usethismethodtoaddservicestothecontainer.publicvoidConfigureServices(IServiceCollectionservices){services.AddControllers(options=>options.Filters.Add
