有没有一种简单的日志记录方法(例如使用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选择了哪个路由来处理该请求并进行记录。 (并且理想情况下,我不想向每个控制器方法添加日志,对于所有传入请求,必须有某种方法通常可以一次执行此操作)
答案 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正确