2016-07-07 23 views
5

Tôi đọc mà bên trong MVC sử dụng khuôn khổ middleware đăng nhập hành động phạm vi withing contoller của:MVC phạm vi khai thác gỗ

Sử dụng Scopes ít, và chỉ cho những hành động với một sự khởi đầu bị chặn và kết thúc. Ví dụ: khung cung cấp phạm vi xung quanh các hành động MVC. Tránh lồng nhiều phạm vi vào nhau.

Một phạm vi là một loại IDisposable trở bằng cách gọi phương pháp ILogger.BeginScope, kéo dài từ lúc nó được tạo ra cho đến khi nó được xử lý. Bất kỳ trạng thái ghi nào, chẳng hạn như id giao dịch, được đính kèm vào phạm vi khi được tạo.

Tôi đang cố gắng sử dụng tính năng này để viết một số thông tin nhật ký. Tôi thực hiện các bước dưới đây: Ứng dụng

1) tạo Asp.net MVC lõi
2) đặt thuộc tính "IncludeScopes" là "true" trong appsetting.json
3) tạo ra bộ điều khiển và hành động như thế này:

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

Tôi hy vọng rằng luồng thông điệp tường trình của tôi luôn luôn sẽ chỉ chứa "Liệt kê tất cả các mục đã bắt đầu" và "Liệt kê tất cả các mục đã hoàn thành" các phần không được phân cách bởi nhau. Nhưng khi tôi bắt đầu hai yêu cầu trong thời gian cùng một dòng chảy log Got như:

RequestId: xxx Bảng liệt kê tất cả các mục bắt đầu
RequestId: yyy Bảng liệt kê tất cả các mục bắt đầu
RequestId: xxx Bảng liệt kê tất cả các mục xong
RequestId : yyy Liệt kê tất cả các mục đã hoàn thành

Lý do là gì? Đó là hành vi chính xác và tôi hiểu lầm "phạm vi" hạn trong bối cảnh khai thác gỗ?

+0

Không đặt thẻ vào tiêu đề câu hỏi, trừ khi đó là nội dung hữu ích cho cuộc trò chuyện! http://stackoverflow.com/help/tagging – Tseng

Trả lời

3

Phạm vi ghi nhật ký giúp tạo phạm vi mà theo đó bất kỳ báo cáo nhật ký nào được tạo trong phạm vi nó sẽ có sẵn thông tin đó.

Tiếp theo ra là từ ConsoleLogger với IncludeScopes thiết lập để 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 

Nếu bạn nhận thấy các bản ghi ở trên, đây RequestId:0HKT6JC0EVFNA đang được in cho mỗi tuyên bố log (như đã đề cập trước đó tất cả các báo cáo đăng nhập trong một phạm vi hoặc lồng nhau phạm vi sẽ nhận được thông tin từ tất cả các phạm vi đó)

Một số phạm vi nhật ký được tạo theo mặc định trong ASP.NET là phạm vi RequestId như đã thấy ở trên và phạm vi xung quanh lời gọi hành động của trình điều khiển MVC như đã xem fr om nhật ký (ví dụ dòng này: => WebApplication8.Controllers.ValuesController.Get (WebApplication8))

Bạn mình có thể tạo ra phạm vi quá nếu bạn cần:

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

Lưu ý: Tất cả logger không hỗ trợ phạm vi theo mặc định.Trong trường hợp của ConsoleLogger nó in ra phạm vi trong định dạng văn bản nhưng phạm vi thực sự tỏa sáng trong trường hợp đăng nhập có cấu trúc như được thảo luận tiếp theo.

Phạm vi hữu ích như thế nào? Khung đăng nhập ASP.NET cho phép bạn thực hiện structured logging. Ví dụ, trong đoạn mã trên {OrderOrchestrationId} được sử dụng cho mục đích này. Serilog có trình ghi nhật ký cho ASP.NET 5, thực hiện ghi nhật ký có cấu trúc và sử dụng điều này, bạn có thể ghi dữ liệu ví dụ như json vào DocumentDB của Azure. Vì vậy, trong trường hợp này nếu OrderOrchestrationId được ghi vào DocumentDB của Azure, bạn có thể tìm kiếm các nhật ký với id này sẽ khó thực hiện với tìm kiếm tệp văn bản phẳng.

Các vấn đề liên quan