?
多用户ƈ发的环境下,通常是由不同的线E分别处理不同的客户端请求。此时要在日志信息中区分Z同的客户端,你可以ؓ每一个线E生成一个LoggerQ从
而从一堆日志信息中区分出哪些信息是属于哪个U程的,但这U方式ƈ不高效。Log4J巧妙C用了Neil
Harrison提出?#8220;NDCQ嵌套诊断环境)”机制来解册个问题。Log4J为同一cd的线E生成一个LoggerQ多个线E共享用,而它仅在?
志信息中d能够区分不同U程的信息。NDC是什么?举例来说Q如果一个Servlet接到q发hӞ为每一个客L创徏一个新的线E,然后分配一个用
于保存该h上下文的NDC堆栈。该上下文可能是发出h的主机名、IP地址或其它Q何可以用于标识该h的信息。这P׃不同的客L处理U程h?
同的NDC堆栈Q即使这个Servlet同时生成多个U程处理不同的请求,q些日志信息仍然可以区分出来Q就好像Log4J为每一个线E都单独生成了一?
Logger实例一栗在Log4J中是通过org.apache.log4j.NDC实现q种机制的。用NDC的方法也很简单,步骤如下Q?
1. 在进入一个环境时调用NDC.push(String)Q然后创Z个NDCQ?
2. 所做的日志操作输出中包括了NDC的信息;
3. d该环境时调用NDC.popҎQ?
4. 当从一个线E中退出时调用NDC.removeҎQ以侉K放资源?
下面是一个模拟记录来自不同客Lh事g的例子,代码如下Q?br />
import org.apache.log4j.Logger;
import org.apache.log4j.NDC;
public class TestNDC {
static Logger log = Logger.getLogger(TestNDC.class.getName());
public static void main(String[] args) {
log.info("Make sure %x is in your layout pattern!");
// 从客L获得IP地址的例?/span>
String[] ips = {"192.168.0.10","192.168.0.27"};
for (int i = 0; i<ips.length ; i++) // 模拟一个运行方?/span>
{
// IP放进 NDC?/span>
NDC.push(ips[i]);
log.info("A NEW client connected, who's ip should appear in this log message.");
NDC.pop();
}
NDC.remove();
log.info("Finished.");
}
}
注意配置文g中的布局格式中一定要加上%x。系l输出如下:
INFO - Make sure %x is in your layout pattern!
INFO 192.168.0.10 - A NEW client connected, who's ip should appear in this log message.
INFO 192.168.0.27 - A NEW client connected, who's ip should appear in this log message.
INFO - Finished.

]]>