Muốn có ví dụ?
Hãy API Web sau đây viết bằng ASP.NET MVC4:
// GET api/HypervResource
public string Get()
{
logger.Debug("Start of service test");
System.Threading.Thread.Sleep(5000); // simulate work
logger.Debug("End of service test");
return "HypervResource controller running, use POST to send JSON encoded RPCs";
}
Khi máy chủ yêu cầu HTTP đồng thời được thực hiện, khai thác gỗ có thể nhận được xen kẽ. Ví dụ.
2013-06-27 13:28:11,967 [10] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:12,976 [12] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:14,116 [13] DEBUG HypervResource.WmiCalls [(null)] - Start of service test
2013-06-27 13:28:16,971 [10] DEBUG HypervResource.WmiCalls [(null)] - End of service test
2013-06-27 13:28:17,979 [12] DEBUG HypervResource.WmiCalls [(null)] - End of service test
2013-06-27 13:28:19,119 [13] DEBUG HypervResource.WmiCalls [(null)] - End of service test
Trong ví dụ đơn giản này, bạn có thể sử dụng id luồng để phân biệt các yêu cầu, nhưng có thể phức tạp khi tệp nhật ký phát triển phức tạp.
Một lựa chọn tốt hơn là cung cấp số nhận dạng duy nhất nhóm các thông điệp nhật ký nhóm lại cho cùng một yêu cầu. Chúng tôi có thể cập nhật mã như sau:
// GET api/HypervResource
public string Get()
{
using(log4net.NDC.Push(Guid.NewGuid().ToString()))
{
logger.Debug("Start of service test");
System.Threading.Thread.Sleep(5000); // simulate work
logger.Debug("End of service test");
return "HypervResource controller running, use POST to send JSON encoded RPCs";
}
}
Điều này tạo ra nhật ký bạn có thể grep để xem các vấn đề liên quan đến yêu cầu cụ thể. Ví dụ.
2013-06-27 14:04:31,431 [11] DEBUG HypervResource.WmiCalls [525943cb-226a-43c2-8bd5-03c258d58a79] - Start of service test
2013-06-27 14:04:32,322 [12] DEBUG HypervResource.WmiCalls [5a8941ee-6e26-4c1d-a1dc-b4d9b776630d] - Start of service test
2013-06-27 14:04:34,450 [13] DEBUG HypervResource.WmiCalls [ff2246f1-04bc-4451-9e40-6aa1efb94073] - Start of service test
2013-06-27 14:04:36,434 [11] DEBUG HypervResource.WmiCalls [525943cb-226a-43c2-8bd5-03c258d58a79] - End of service test
2013-06-27 14:04:37,325 [12] DEBUG HypervResource.WmiCalls [5a8941ee-6e26-4c1d-a1dc-b4d9b776630d] - End of service test
2013-06-27 14:04:39,453 [13] DEBUG HypervResource.WmiCalls [ff2246f1-04bc-4451-9e40-6aa1efb94073] - End of service test
Dường như log4net đã bị phản đối NDC nghiêng về bối cảnh mục đích chung ngăn xếp. Lời khuyên trong câu trả lời vẫn đúng, nhưng http://logging.apache.org/log4net/release/manual/contexts.html nói "NDC (Ngữ cảnh Chẩn đoán lồng nhau) tồn tại để tương thích với các phiên bản cũ hơn của log4net.Lớp helper này triển khai một ngăn xếp được lưu trữ trong thuộc tính bối cảnh luồng có tên là NDC. ” –