2016-07-07 2 views
5

Я читал, что в MVC Framework промежуточного использования регистрации действия Scope жгутов в: Контроллер илитMVC каротаж сфера

Используйте Scopes экономно, и только для действий с ограниченным началом и концом. Например, структура обеспечивает область действия MVC. Избегайте вложенности многих областей внутри друг друга.

И

Область действия представляет собой IDisposable тип, возвращаемый с помощью вызова метода ILogger.BeginScope, который длится от момента его создания до тех пор, пока не будет удален. Любое состояние регистрации, такое как идентификатор транзакции, присоединяется к области при ее создании.

Я пытаюсь использовать эту функцию для записи некоторых данных журнала. Я выполнил шаги:

1) создать ядро ​​Asp.net MVC приложение
2) установить свойство "IncludeScopes", как "истинный" в appsetting.json
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" }; 
    } 
} 

Я ожидаю, что поток сообщений в журнале всегда будет содержать только «Листинг всех элементов» и «Составление списка всех элементов», которые не разделены друг другом. Но когда я начал два запроса в то же время поток журнала GOT как:

RequestID: хая Listing всех элементов начал
RequestID: ий Список всех элементов начал
RequestID: ххй Список всех элементов закончили
RequestID : yyy Составление списка всех объектов

В чем причина? Правильно ли это поведение, и я неправильно понял термин «область действия» в контексте ведения журнала?

+0

Не помещайте теги в заголовок вопроса, если только это не является органическим для разговора! http://stackoverflow.com/help/tagging – Tseng

ответ

3

Области ведения журналов помогают создавать области, с помощью которых любые созданные в журнале операторы в пределах имели бы доступную информацию.

После вне от 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 позволяет делать structured logging. Например, в приведенном выше коде {OrderOrchestrationId} был использован для этой цели. Serilog имеет регистратор для ASP.NET 5, который реализует структурированное ведение журнала и с помощью этого вы можете, например, записывать данные как json данных в документ Azure DocumentDB. Итак, в этом случае, если OrderOrchestrationId был записан в документ Azure DocumentDB, вы можете искать журналы с этим идентификатором, что было бы трудно сделать при поиске текстовых файлов.

Смежные вопросы