3

在过去,当对 Web 应用程序的每个请求都由一个线程处理时,很容易理解日志。例如,可以使用 servlet 过滤器来命名处理具有某种请求 ID 的请求的线程。然后可以在日志中输出此请求 ID。在这个世界上,只需要一个简单的 grep 就可以收集给定请求的日志行。

在我目前的职位上,我正在使用 Scala 构建 Web 应用程序(我们使用的是 Scalatra,但这与我的问题并不特别相关)。每个请求都会创建一个 scala.concurrent.Future ,然后将其停放在该未来完成之前。这里重要的一点是,实际处理业务逻辑的线程与处理请求的线程不同(我认为)与完成请求的线程不同,因此该请求的上下文在处理过程中丢失。业务逻辑可以记录它喜欢的所有内容,但很难将该记录与其相关的特定请求相关联。

现在从在生产中支持我的 Web 服务的角度来看,旧方法很棒,我想为我的异步服务提供类似的东西。我一直在尝试想出一种方法来做到这一点,但是却一无所获。也就是说,我还没有想出像旧的名称线程模型那样轻量级的东西。Stack Overflow 人群有什么建议吗?

谢谢

4

2 回答 2

0

如您所写,为每个请求分配一个 id,并将其传递给业务逻辑函数。您也可以使用隐式参数来执行此操作,这样您的代码就不会混乱。

于 2013-05-29T19:57:32.523 回答
0

这应该可以通过 SLF4j 提供的 MDC 日志记录来实现,它使用线程本地存储来存储每个请求的上下文。您还必须创建一个 MDC 上下文传播执行上下文,以跨线程移动上下文。

这篇文章很好地描述了它: http ://code.hoosuite.com/logging-contextual-info-in-an-asynchronous-scala-application/

于 2017-08-16T11:20:51.753 回答