【发布时间】:2016-07-07 10:32:02
【问题描述】:
我读到在 MVC 中间件框架内部使用带有控制器操作的日志记录范围:
谨慎使用作用域,并且只用于有界的开始和结束的动作。例如,该框架提供了围绕 MVC 操作的范围。避免在另一个范围内嵌套多个范围。
和
作用域是调用 ILogger.BeginScope 方法返回的 IDisposable 类型,从创建的那一刻一直持续到释放。任何日志状态,例如事务 ID,都会在创建时附加到范围。
我正在尝试使用此功能来编写一些日志信息。我执行了以下步骤:
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 列出所有已完成的项目
这是什么原因?这是正确的行为吗?我在日志记录的上下文中误解了“范围”一词?
【问题讨论】:
-
不要在问题标题中添加标签,除非它是对话的有机内容! stackoverflow.com/help/tagging
标签: logging scope asp.net-core asp.net-core-mvc