3

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

}
4

2 回答 2

4

NDC 只是将“上下文”(自由格式字符串)添加到所有日志消息(可能会或可能不会输出,具体取决于日志记录格式)。嵌套部分意味着NDC.pop()返回到前一个(下一层)上下文。

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

于 2011-05-25T10:49:41.413 回答
3

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

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

于 2011-05-25T10:49:10.680 回答