2016-07-07 78 views
5

ho letto che all'interno MVC uso quadro middleware accedendo azione portata withing di contoller:MVC registrazione portata

utilizzare gli ambiti con parsimonia, e solo per azioni con un inizio e di fine limitato. Ad esempio, il framework fornisce un ambito attorno alle azioni MVC. Evita di annidare molti ambiti l'uno dentro l'altro.

E

Un ambito è un tipo IDisposable restituito chiamando il metodo ILogger.BeginScope, che dura dal momento in cui viene creato fino è disposto. Qualsiasi stato di registrazione, ad esempio un ID transazione, è collegato all'ambito quando viene creato.

Sto tentando di utilizzare questa funzione per scrivere alcune informazioni di registro. Ho eseguito passaggi indicati

1) creare Asp.net nucleo MVC app
2) impostare proprietà "IncludeScopes" come "vero" in appsetting.json
3) creare controllore e azione simili:

[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" }; 
    } 
} 

Mi aspetto che il flusso dei miei messaggi di registro contenga sempre solo le parti "Elenco di tutti gli articoli avviati" e "Elenco di tutti gli articoli finiti" che non sono separati l'uno dall'altro. Ma quando ho iniziato due richieste nello stesso tempo un flusso di log Got come:

IDRichiesta: xxx Listing tutte le voci iniziato
IDRichiesta: yyy Listing tutte le voci iniziato
IDRichiesta: xxx Elenco di tutti i prodotti lavorati
IDRichiesta : yyy Elenco di tutti gli articoli terminati

Qual è il motivo? È un comportamento corretto e ho frainteso il termine "scope" nel contesto della registrazione?

+0

Non inserire tag nel titolo della domanda, a meno che non sia organico per la conversazione! http://stackoverflow.com/help/tagging – Tseng

risposta

3

Gli ambiti di registrazione consentono di creare ambiti in base ai quali sono state create le istruzioni di registro all'interno di.

seguito fuori da ConsoleLogger con IncludeScopes insieme a 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 

Se si nota il registro di cui sopra, qui RequestId:0HKT6JC0EVFNA viene stampato per ogni dichiarazione di log (come detto in precedenza tutte le dichiarazioni di registro all'interno di un ambito o nidificato lo scope otterrebbe informazioni da tutti gli ambiti)

Alcuni ambiti di registro creati per impostazione predefinita in ASP.NET sono l'ambito RequestId come visto sopra e anche l'ambito attorno all'invocazione di azione del controller MVC come visto da om il registro (ad esempio questa linea: => WebApplication8.Controllers.ValuesController.Get (WebApplication8))

Lei stesso può crea ambiti di troppo se avete bisogno:

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

Nota: Tutti i data logger non supportano gli ambiti di default.In caso di ConsoleLogger, stampa gli ambiti in formato testo, ma gli ambiti risultano davvero brillanti in caso di registrazione strutturata come discusso in seguito.

Come sono utili gli ambiti? Il framework di registrazione ASP.NET consente di eseguire structured logging. Ad esempio, nel codice precedente {OrderOrchestrationId} è stato utilizzato per questo scopo. Serilog dispone di un logger per ASP.NET 5 che implementa la registrazione strutturata e, utilizzando questo, è possibile ad esempio scrivere dati come dati json in DocumentDB di Azure. Quindi in questo caso se OrderOrchestrationId è stato scritto in DocumentDB di Azure, è possibile cercare nei registri con questo ID che sarebbe stato difficile fare con la ricerca di file di testo piatto.