加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

MVC记录范围

发布时间:2020-12-16 06:55:17 所属栏目:asp.Net 来源:网络整理
导读:我读到MVC中间件框架内部使用带有控制器操作的日志范围: Use Scopes sparingly,and only for actions with a bounded start and end. For example,the framework provides a scope around MVC actions . Avoid nesting many scopes within one another. 和
我读到MVC中间件框架内部使用带有控制器操作的日志范围:

Use Scopes sparingly,and only for actions with a bounded start and end. For example,the framework provides a scope around MVC actions. Avoid nesting many scopes within one another.

A scope is an IDisposable type returned by calling the ILogger.BeginScope method,which lasts from the moment it is created until it is disposed. Any logging state,such as a transaction id,is attached to the scope when it is created.

我正在尝试使用此功能来编写一些日志信息.我执行了以下步骤:

1)创建Asp.net核心MVC应用程序
2)在appsetting.json中将属性“IncludeScopes”设置为“true”
3)创建这样的控制器和动作:

[Route("api/[controller]")]
public class TodoController : Controller
{
    private readonly ILogger<TodoController> _logger;
    public TodoController(ILogger<TodoController> logger)
    {
        _logger = logger;
    }

    // GET: api/values
    [HttpGet]
    public IEnumerable<string> Get()
    {
        _logger.LogInformation(1000,"Listing all items started");
        Thread.Sleep(2000);
        _logger.LogInformation(1000,"Listing all items finished");
        return new string[] { "value1","value2" };
    }
}

我希望我的日志消息流始终只包含“列出所有项目已启动”和“列出所有已完成的项目”部分,这些部分彼此不相互分离.
但当我在同一时间启动两个请求时,得到的日志流如下:

????RequestId:xxx列出所有已启动的项目
????RequestId:yyy列出所有已启动的项目
????RequestId:xxx列出所有已完成的项目
????RequestId:yyy列出所有已完成的项目

什么原因?这是正确的行为,我在记录的背景下误解了“范围”一词吗?

解决方法

日志记录范围有助于创建范围,通过该范围在其中创建的任何日志语句都可以获得该信息.

以下是来自ConsoleLogger并将IncludeScopes设置为true:

info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
      => RequestId:0HKT6JC0EVFNA RequestPath:/api/values
      Request starting HTTP/1.1 GET http://localhost:5000/api/values
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
      => RequestId:0HKT6JC0EVFNA RequestPath:/api/values => WebApplication8.Controllers.ValuesController.Get (WebApplication8)
      Executing action method WebApplication8.Controllers.ValuesController.Get (WebApplication8) with arguments () - ModelState is Valid
info: Microsoft.AspNetCore.Mvc.Internal.ObjectResultExecutor[1]
      => RequestId:0HKT6JC0EVFNA RequestPath:/api/values => WebApplication8.Controllers.ValuesController.Get (WebApplication8)
      Executing ObjectResult,writing value Microsoft.AspNetCore.Mvc.ControllerContext.
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
      => RequestId:0HKT6JC0EVFNA RequestPath:/api/values => WebApplication8.Controllers.ValuesController.Get (WebApplication8)
      Executed action WebApplication8.Controllers.ValuesController.Get (WebApplication8) in 322.8533ms
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[2]
      => RequestId:0HKT6JC0EVFNA RequestPath:/api/values
      Request finished in 428.477ms 200 application/json; charset=utf-8

如果您注意到上面的日志,那么这里为每个日志语句打印了RequestId:0HKT6JC0EVFNA(如前所述,范围或嵌套范围内的所有日志语句都将从所有这些范围获取信息)

默认情况下在ASP.NET中创建的一些日志范围是如上所示的RequestId范围,也是从日志中看到的MVC控制器操作调用的范围(例如,此行:=> WebApplication8.Controllers.ValuesController.Get(WebApplication8) )

如果需要,您也可以自己创建范围:

using (logger.BeginScope("OrderOrchestrationId:{OrderOrchestrationId}",orderOrchestrationId))
{
   // any log statements from here on would have `OrderOrchestrationId` available
}

注意:
默认情况下,所有记录器都不支持范围.在ConsoleLogger的情况下,它以文本格式打印范围,但是在结构化日志记录的情况下,范围确实很大,如下所述.

范围如何有用?
ASP.NET日志框架允许您进行结构化日志记录.例如,在上面的代码中,{OrderOrchestrationId}用于此目的. Serilog有一个用于ASP.NET 5的记录器,它实现了结构化日志记录,使用它可以将数据作为json数据写入Azure的DocumentDB.因此,在这种情况下,如果将OrderOrchestrationId写入Azure的DocumentDB,则可以使用此id搜索日志,这对于平面文本文件搜索很难.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读