如何记录所选的asp.net Core MVC路由

时间:2019-10-18 05:35:27

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

有没有一种简单的日志记录方法(例如使用nlog log.Debug(...))将选定的路由记录在asp.net核心mvc应用程序中。我使用HttpGet / Post属性定义路由,并且正在寻找一种简单的方法来记录MVC选择处理每个传入请求的路由。

注意:已经回答了类似的问题,但与调试和分析路线有关: How do you debug MVC 4 API routes? https://haacked.com/archive/2008/03/13/url-routing-debugger.aspx/

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

2 个答案:

答案 0 :(得分: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>();

答案 1 :(得分:-2)

在IIS上,您可以使用web.config文件。默认情况下,此文件中有一个选项stdoutLogEnabled=false。将其切换为true。将会生成包含所需信息的日志。

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