Wollen Sie ein Beispiel?
Nehmen Sie die folgende Web-API geschrieben ASP.NET MVC4 mit:
// 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";
}
Wenn Server gleichzeitige HTTP-Requests vorgenommen werden, kann die Protokollierung verschachtelt bekommen. Z.B.
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
In diesem einfachen Beispiel, könnten Sie die Thread-ID verwenden Anfragen zu unterscheiden, aber das kann schwierig werden, wie die Protokolldatei in Komplexität wächst.
Eine bessere Alternative besteht darin, eindeutige Bezeichner bereitzustellen, die Protokollnachrichten für die gleiche Anforderung gruppieren. Wir können den Code in Bezug auf die folgende Update:
// 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";
}
}
Dies erzeugt ein Protokoll, das Sie grep können die Probleme mit einer bestimmten Anforderung zugeordnet ist, um zu sehen. Z.B.
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
Es ist wie log4net aussieht hat NDC veraltet für allgemeine Zwecke Kontext stapelt. Der Ratschlag in den Antworten ist immer noch wahr, aber http://logging.apache.org/log4net/release/manual/contexts.html sagt "Der NDC (Nested Diagnostic Context) existiert aus Gründen der Kompatibilität mit älteren Versionen von log4net.Diese Hilfsklasse implementiert einen Stapel, der in der Threadkontexteigenschaft namens NDC gespeichert wird. " –