ASP.NET Core中的日志控制器操作持续时间

时间:2018-12-07 16:54:59

标签: asp.net-core

对于一项要求,我们需要记录aspnet核心操作请求的持续时间。在请求结束时,必须记录持续时间(秒表),我们还需要知道使用了哪个控制器和哪种操作方法。

执行此操作的最佳位置是什么?动作过滤器,中间件?又如何?

2 个答案:

答案 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.HostingMicrosoft.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