gpt4 book ai didi

.net - 何时使用 'nested diagnostic context' (NDC)?

转载 作者:行者123 更新时间:2023-12-03 05:43:49 34 4
gpt4 key购买 nike

在使用 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 的编程经验,您什么时候发现此功能很有用?

最佳答案

想要一个例子吗?

采用使用 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

关于.net - 何时使用 'nested diagnostic context' (NDC)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/334367/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com