我有一个在其线程中运行的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?
}
}
答案 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。这仍然允许您从日志中检索所有必要的会话数据,并识别任何特定日志消息的相应会话。