log4j,嵌套诊断上下文

时间:2011-05-25 10:41:02

标签: java log4j ndc

我有一个在其线程中运行的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? 
    }

}

2 个答案:

答案 0 :(得分:3)

NDC只是向所有日志消息添加“上下文”(自由形式字符串)(根据日志记录格式可能会输出也可能不输出)。嵌套部分意味着NDC.pop()返回上一个(下一层向上)上下文。

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

答案 1 :(得分:2)

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

E.g。在你的情况下,将sesion开始时间放入每个日志消息将是过度的(也可能是模糊的)。最好只将某种唯一的会话ID推送到NDC中(如果你有这样的东西),并在设置后立即记录任何其他会话细节,例如用户名,专用消息中的启动时间NDC。这仍然允许您从日志中检索所有必要的会话数据,并识别任何特定日志消息的相应会话。