Java log4j,嵌套诊断上下文

Java log4j,嵌套诊断上下文,java,log4j,ndc,Java,Log4j,Ndc,我有一个MySession对象(一个通用会话,而不是web)在其线程中运行。我想使用NDC类来包含一些从MySession字段中获取的数据:创建它的用户、开始时间等等。我想将字段“呈现”到消息中。是可能的,还是只支持邮件? 提前谢谢 public class MySession { String userName; Date startTime; public void doSomething() { NDC.push(this);

我有一个MySession对象(一个通用会话,而不是web)在其线程中运行。我想使用NDC类来包含一些从MySession字段中获取的数据:创建它的用户、开始时间等等。我想将字段“呈现”到消息中。是可能的,还是只支持邮件? 提前谢谢

public class MySession {
    String userName;
    Date startTime;

    public void doSomething() {
        NDC.push(this);                                    //cannot do something like this?
        NDC.push(this.userName 
                  + " " + startTime.toString());          //or should I do this? 
    }

}

实际上,您可以将任何文本(或任何对象的文本表示)放入NDC。不支持将对象渲染到NDC中,因为
toString()
几乎总是足够(至少应该足够)。NDC中过多和/或复杂的内容会使日志更难阅读,因此建议将NDC内容限制在必要的最低限度

例如,在您的情况下,将sesion开始时间放在每个日志消息中会有过大的杀伤力(并且可能会有歧义)。最好只将某种独特的会话id推送到NDC(如果您有这样的东西,也就是说),并在设置NDC后立即在专用消息中记录任何其他会话详细信息,例如用户名、启动时间。这仍然允许您从日志中检索所有必要的会话数据,并为任何特定的日志消息标识相应的会话。

NDC只是将“上下文”(自由格式字符串)添加到所有日志消息中(根据日志格式的不同,可能输出,也可能不输出)。嵌套部分意味着
NDC.pop()
返回上一层(上一层)上下文


尽管如此,在任何给定的点上,上下文都是一个自由格式的字符串-因此您必须推送类似于
this.username+'.+this.startTime.toString()
的内容,如第二个示例所示。您可以从中看到,
push
接受一个字符串参数;此上下文仅用于作为日志消息的一部分(隐式为字符串),因此接受不同类型的任意对象没有任何好处。

好的,但如果它这么简单,它不是克隆吗,一个简单的线程标识符“好名字”,已经在没有NDC的情况下提供了?@AgostinoX,否,它的用途更广泛,可以以线程id无法使用的方式使用。例如,在web应用程序中,它可以包含会话id,其中会话通常跨越多个请求(因此由多个不同的线程处理)。