【问题标题】:How to log the selected ASP.NET Core MVC route?如何记录选定的 ASP.NET Core MVC 路由?
【发布时间】:2019-10-18 05:35:27
【问题描述】:

是否有一种简单的方法来记录(使用 nlog,例如log.Debug(…))在 ASP.NET Core MVC 应用程序中选择的路由?我使用HttpGet/HttpPost 属性来定义我的路由,并且我正在寻找一种简单的方法来记录 MVC 为每个传入请求选择处理的路由。

注意:已经回答了类似的问题,但它们与调试和分析路由有关:

不过,出于我的目的,我只想知道 MVC 选择了哪个路由来处理请求并将其记录下来。 (而且,理想情况下,我不想为每个控制器方法添加日志;必须有某种方法可以对所有传入请求进行一次通用操作。)

【问题讨论】:

  • 在.NET Core中,你可以按照这个教程来实现你想要的:tutorialsteacher.com/core/aspnet-core-logging
  • 谢谢,是的,这行得通,所以为了澄清一下,一旦设置了 NLog 或其他记录器,我在名为 Microsoft.AspNetCore.Routing.Matching.DfaMatcher 的 Microsoft 记录器中找到了信息

标签: c# asp.net-core asp.net-core-mvc asp.net-routing


【解决方案1】:

记录所有请求的简单通用方法是使用已注册的中间件组件。

    public class PerformanceMiddleware
    {
        private readonly RequestDelegate _next;

        public PerformanceMiddleware(RequestDelegate requestDelegate)
        {
            _next = requestDelegate;
        }

        public Task Invoke(HttpContext httpContext)
        {
            var watch = new Stopwatch();
            watch.Start();

            var nextTask = _next.Invoke(httpContext);
            nextTask.ContinueWith(t =>
            {
                var time = watch.ElapsedMilliseconds;
                var requestString = $"[{httpRequest.Method}]{httpRequest.Path}?{httpRequest.QueryString}";
                if (t.Status == TaskStatus.RanToCompletion)
                {
                    .. log.Info ..($"{time}ms {requestString}");
                }
                else
                {
                    .. log.Warn ..($"{time}ms [{t.Status}] - {requestString}", t.Exception?.InnerException);
                }
            });
            return nextTask;
        }
    }

这也会记录执行时间

在您的启动中,您将其注册为第一个,在 UseMvc 和任何其他中间件组件之前。

            app.UseMiddleware<PerformanceMiddleware>();

【讨论】:

  • 这里引用的httpRequest对象其实来自httpContext.Request。你可以这样填充它: var httpRequest = httpContext.Request;
【解决方案2】:

在 IIS 上,您可以使用 web.config 文件。在这个文件中,默认有一个选项stdoutLogEnabled=false。切换到true。将生成一个包含您想要的信息的日志。

编辑:根据下面的 cmets 更新了我的答案以指定它仅对 IIS 正确

【讨论】:

  • 你确定吗?
  • 是的,我在上一个用 .NET Core 2.2 编写的 Web Api 中使用了该选项
  • 不确定这是否有帮助,Rahul 在问题中的评论有效。
  • @An0d NET Core 你应该有一个 web.config 文件吗?它是否正确?我在 .NET Core 项目中没有看到 web.config 文件。
  • ASP.NET Core 不使用 web.config。它是作为发布的一部分生成的,以防您碰巧部署到 IIS,而stdoutLogFile 仅适用于该特定场景。这不是解决方案。
猜你喜欢
  • 2019-12-30
  • 2018-08-11
  • 1970-01-01
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多