对于一项要求,我们需要记录aspnet核心操作请求的持续时间。在请求结束时,必须记录持续时间(秒表),我们还需要知道使用了哪个控制器和哪种操作方法。
执行此操作的最佳位置是什么?动作过滤器,中间件?又如何?
答案 0 :(得分:0)
如果您打算记录控制器/操作的经过时间。为此,您可以编写自己的中间件。请查看以下示例:
public class DiagnosticsMiddleware
{
private readonly RequestDelegate _next;
public DiagnosticsMiddleware(RequestDelegate next)
{
_next = next;
_esClient = esClient;
}
public async Task Invoke(HttpContext context)
{
Stopwatch sw = Stopwatch.StartNew();
await _next(context);
sw.Stop();
var elapsedTime = sw.ElapsedTicks / (Stopwatch.Frequency / (1000L * 1000L));
LogContext.PushProperty("ElapsedTime", elapsedTime);
}
}
您可以像配置
public void Configure(IApplicationBuilder app)
{
app.UseMiddleware<ContextEnricherMiddleware>();
}
答案 1 :(得分:0)
ASP.NET Core已经收集了此信息。您只需要确保一般情况下以及您希望将其记录在日志中即可。在开发中,这些被发送到控制台。如果您看到它,将会看到类似以下的日志:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET http://localhost:44301/
...
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Route matched with {action = "Index", controller = "Home"}. Executing action MyApp.HomeController.Index (MyApp)
...
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
Request finished in 7.981ms 200 text/html; charset=utf-8
您将感兴趣的主要类别是Microsoft.AspNetCore.Hosting
和Microsoft.AspNetCore.Mvc
,它们都记录在级别Information
上。在生产环境中运行时,默认日志级别为Warning
,这就是为什么您没有将此日志级别记录到那里的原因。您可以简单地将一些内容添加到appsettings.Production.json
文件中,例如:
"Logging": {
"LogLevel": {
"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Mvc": "Information"
}
}
或者您可以指定仅记录特定提供商的日志:
"Serilog": {
"LogLevel": {
"Microsoft.AspNetCore.Hosting": "Information",
"Microsoft.AspNetCore.Mvc": "Information"
}
}
您可以对此进行真正的细化和复杂化。有关更多信息,请参见docs on log filtering。