2016-07-07 11 views
5

las ich, dass Aktion Umfang withing contoller der innerhalb MVC Middleware Framework verwenden Anmeldung:Protokollierung MVC Rahmen

Verwenden Scopes sparsam und nur für Aktionen mit einem begrenzten Anfang und Ende. Zum Beispiel bietet das Framework einen Bereich um MVC Aktionen. Vermeiden Sie, mehrere Bereiche ineinander zu verschachteln.

Und

Ein Bereich ist ein IDisposable Typ zurückgegeben, indem die ILogger.BeginScope Methode aufruft, die von dem Moment dauert es erstellt wird, bis er angeordnet ist. Jeder Protokollierungsstatus, z. B. eine Transaktions-ID, wird beim Erstellen an den Bereich angehängt.

Ich versuche, diese Funktion zu verwenden, um einige Protokollinformationen zu schreiben. I ausgeführten Schritten:

1) Erstellen Asp.net Kern MVC app
2) gesetzt Eigenschaft "IncludeScopes" als "wahr" in appsetting.json
3) Erstellen Controller und die Aktion wie folgt aus:

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

Ich erwarte, dass mein Log Nachrichtenfluss immer nur "Listing all items started" und "Listing all items finished" Teile enthält, die nicht voneinander getrennt sind. Aber wenn ich zwei Anfragen in der gleichen Zeit ein Erhaltenes Protokollfluss als gestartet:

RequestId: xxx Eine Auflistung aller Artikel gestartet
RequestId: yyy Auflistung aller Artikel gestartet
RequestId: xxx Eine Auflistung aller Artikel fertig
RequestId : yyy Auflistung aller Artikel abgeschlossen

Was ist der Grund? Ist es richtiges Verhalten und ich habe "Scope" Begriff im Zusammenhang mit der Protokollierung missverstanden?

+0

Fügen Sie keine Tags in den Fragetitel ein, es sei denn, es handelt sich um eine organische Konversation! http://stackoverflow.com/help/tagging – Tseng

Antwort

3

Protokollierungsbereiche helfen bei der Erstellung von Bereichen, mit denen alle Protokollanweisungen erstellt innerhalb es würde diese Informationen verfügbar haben.

Nach out ist von ConsoleLogger mit IncludeScopes Set 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 

Wenn Sie die oben Protokoll fest, hier RequestId:0HKT6JC0EVFNA für jede Log-Anweisung gedruckt wird (wie innerhalb eines Bereichs früher alle Protokoll Aussagen erwähnten oder verschachtelt Umfang erhalten würde Informationen aus all diesen Bereichen)

einige Log-Bereiche, die standardmäßig erstellt werden, in ASP.NET sind der RequestId Umfang wie oben und auch Umfang um MVC Controller-Aktion Aufruf gesehen als fr gesehen om das Protokoll (Beispiel diese Zeile: => WebApplication8.Controllers.ValuesController.Get (WebApplication8))

Sie selbst Bereiche erstellt, kann auch, wenn Sie brauchen:

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

Hinweis: Alle Logger unterstützen keine Bereiche standardmäßig.Im Fall von ConsoleLogger werden Bereiche im Textformat ausgegeben, aber die Bereiche leuchten wirklich im Fall der strukturierten Protokollierung, wie weiter unten erläutert.

Wie sind Scopes nützlich? ASP.NET Logging-Framework können Sie structured logging tun. Zum Beispiel wurde in dem obigen Code {OrderOrchestrationId} für diesen Zweck verwendet. Serilog verfügt über eine Protokollfunktion für ASP.NET 5, die eine strukturierte Protokollierung implementiert und mit der Sie beispielsweise Daten wie json Daten in Azure's DocumentDB schreiben können. In diesem Fall, wenn OrderOrchestrationId in Azure's DocumentDB geschrieben wurde, können Sie die Protokolle mit dieser ID durchsuchen, die mit der Suche nach Flat-Text-Dateien schwierig gewesen wäre.