在异步Scala web应用程序中组织和分析日志



在过去,当对web应用程序的每个请求都由一个线程处理时,很容易理解日志。例如,可以使用servlet筛选器来用某种请求id命名处理请求的线程。这个请求id可以在日志中输出。在这种情况下,一个简单的grep就可以收集给定请求的日志行。

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

现在,从在生产环境中支持我的web服务的角度来看,旧的方法很好,我想为我的异步服务提出类似的方法。我一直在想办法做这件事,但一无所获。也就是说,我还没有提出任何像旧的线程命名模型那样轻量级的方法。Stack Overflow有什么建议吗?

谢谢

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

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

这篇文章描述得很好:http://code.hootsuite.com/logging-contextual-info-in-an-asynchronous-scala-application/

最新更新