提供日志记录(调试)上下文

3
我有一个应用程序,使用了几个不同的Java类,希望能够向日志消息提供调试上下文。
每个类将单独构建或检索此上下文(基本上是一个字符串),并将其传递给相应的日志调用,例如:
logger.debug(context + ", whatever error message");

所以,我的问题是,在整个应用程序中实现这种功能的最佳模式将是什么?

我考虑让所有需要支持上下文敏感日志记录的类实现一个Java接口,具有一些适当的方法,例如:

public interface ContextSensitive
{
    public String getContext();
    public String setContext();
}

在涉及到IT技术的情况下,setContext()方法可以用于以下情况:当一个对象(比如secondObject)从具有上下文的对象(比如firstObject)实例化时,但是secondObject本身没有上下文时。因此,firstObject也会执行类似以下操作:

secondObject = new SecondObject();
secondObject.setContext(context);

上面的内容是否有意义,或者我需要做些更好的事情吗?

我一直在考虑的另一种选择是编写一个包装器,围绕日志记录库来提供这个功能,但与基于ContextSensitive接口的上述方法相比,我并没有看到任何价值。

如果有任何解决相同问题的开源项目示例,我将感激不尽。

非常感谢!


谢谢,但并不是所有的答案都有效。 :-) - PNS
如果你找到了自己的答案,那么请发布并接受它,以便向社区提供反馈,或者至少接受那些部分回答了问题的答案。如果真的没有好的答案,那么可能是你问错了问题 :) - Andrey Adamovich
啊,是的,我可以发表自己的答案! :-) - PNS
3个回答

3
我猜您想找与 MDC(映射诊断上下文)类似的功能,它是 log4j、logback 和 slf4j 框架的一个特性。该上下文只能在方法调用前设置一次,然后可以配置日志框架以生成包括上下文字段的日志消息。

我已经使用过MDC,但问题在于它是按线程工作的,而我需要在同一线程内多次更改上下文。 - PNS
使用AOP(或Servlet Filter,如果您有Web应用程序)来设置上下文。这是解决此问题的标准方法,它将使您的代码更清洁,因为您不必一直关心将上下文传递给所有方法。 - Andrey Adamovich
只是普通的Java。我使用Log4j/Log5j进行调试。 - PNS
实际上,我对AOP进行了更深入的研究,但这并不是我目前想要做的。我对使用“普通”的Java解决方案感兴趣(而不是使用AspectJ等工具)。 - PNS
没错,没有Spring或其他任何东西。 - PNS
显示剩余2条评论

1

其实我更仔细地看了一下AOP,但目前它不是我想要的。我对“纯粹”的Java解决方案感兴趣(而不是使用像AspectJ这样的工具)。 - PNS
如果您能给出想要记录的具体信息的示例,也许有人会建议一个库。我在下面为性能分析做了这样的事情,但那似乎不是您的情况... - DaveFar
只需在对象之间传递几个字符串值,但可能会在同一线程(数据特定)中多次更改。有点像会话管理。 - PNS

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接