在过去,当每个Web应用程序的请求都由一个线程处理时,很容易理解日志。例如,可以使用servlet过滤器来命名处理具有某种请求ID的请求的线程。然后可以在日志中输出该请求ID。在这个世界中,只需要一个简单的grep来收集给定请求的日志行。
在我目前的职位上,我正在使用Scala构建Web应用程序(我们使用的是Scalatra,但这与我的问题并不特别相关)。每个请求都会创建一个scala.concurrent.Future,然后停放,直到该未来完成。这里重要的一点是,实际处理业务逻辑的线程与处理请求的线程不同,该线程与完成请求的线程不同(我认为),因此在处理过程中该请求的上下文丢失。业务逻辑可以记录它喜欢的所有内容,但很难将该日志记录与它所涉及的特定请求相关联。
现在从支持我的Web服务生产的角度来看,旧的方法很棒,我想为我的异步服务提出类似的东西。我一直试图找到一种方法来做到这一点,但已经空了。也就是说,我没有提出任何与旧的,名称 - 线程模型一样重量轻的东西。 Stack Overflow人群有任何建议吗?
由于
答案 0 :(得分:0)
正如您所写,为每个请求分配一个id,并将其传递给业务逻辑函数。您也可以使用隐式参数执行此操作,这样您的代码就不会混乱。
答案 1 :(得分:0)
这可以通过SLF4j使用MDC日志记录来实现,SLF4j使用线程本地存储来存储每个请求的上下文。 此外,您还必须创建一个MDC Context Propagating执行上下文,以跨线程移动上下文。
这篇文章描述得很好: http://code.hootsuite.com/logging-contextual-info-in-an-asynchronous-scala-application/