当前位置:  开发笔记 > 后端 > 正文

何时使用'嵌套诊断上下文'(NDC)?

如何解决《何时使用'嵌套诊断上下文'(NDC)?》经验,为你挑选了3个好方法。

使用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的编程经验中,您何时发现此功能有用?



1> Donal Laffer..:

想要一个例子吗?

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



2> Joe..:

在ASP.NET等服务器应用程序中.

例如,您可以将有关当前请求的信息推送到NDC.


我没有链接,但想想你有一个ASP.NET应用程序,同时处理许多同时请求的情况.如果将请求ID(生成或使用请求中的某些标识符)推送到NDC,则可以通过应用程序的所有级别关联给定请求的所有日志消息.因此,现在来自您不了解ASP.NET的低级组件的日志消息可以与原始请求相关联.
示例链接很有用

3> Eugene Yokot..:

当您有大量日志要通过时,这些功能会派上用场.你什么时候会有很多日志?使用交错输出诊断生产系统上的奇怪错误.拥有更多上下文可以过滤输出或不输出不需要的日志.

另一种情况是嵌套上下文可能有用,如果在不同的上下文中多次调用方法或某个特性,并且需要一种方法来区分它们.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有