在使用log4net时,我看到了使用称为NDC的每个线程的上下文标签堆栈的可能性。
通过指定%x或%ndc PatternLayout参数,压入此堆栈的标签将显示在格式中。
其用法类似于:
ILog log = log4net.LogManager.GetLogger(...) ;
//pattern layout format: "[%ndc] - %message%newline"
log.Info("message 1");
using(log4net.NDC.Push("context")
{
using(log4net.NDC.Push("inner_context")
{
log.Info("message 2");
}
log.Info("message 3");
}
log.Info("message 4"); 输出类似于:
null - message 1
context inner_context - message 2
context - message 3
null - message 4在您使用log4net的编程经验中,您是什么时候发现这个特性有用的?
发布于 2008-12-02 16:51:13
在诸如ASP.NET之类的服务器应用程序中。
例如,您可以将有关当前请求的信息推送到NDC。
发布于 2013-06-27 21:07:05
想要一个例子吗?
下面是使用ASP.NET MVC4编写的Web API:
// 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";
}当发出服务器并发HTTP请求时,日志记录可能会交错。例如。
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在这个简单的示例中,您可以使用线程id来区分请求,但随着日志文件的复杂性增加,这可能会变得很棘手。
一种更好的替代方法是提供唯一的标识符,将同一请求的日志消息分组在一起。我们可以将代码更新为以下内容:
// 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";
}
}这将生成一个日志,您可以使用grep来查看与特定请求相关的问题。例如。
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发布于 2008-12-02 16:02:53
当您有大量日志要处理时,这些功能会派上用场。你什么时候会有很多日志?在具有交错输出的生产系统上诊断奇怪的bug。拥有更多的上下文为您提供了过滤输出或不输出不需要的日志的方法。
另一种情况是,如果一个方法或某个功能在不同的上下文中被多次调用,并且您需要一种方法来区分它们,则嵌套上下文可能会很有用。
https://stackoverflow.com/questions/334367
复制相似问题