根据模块化整体式 Web 应用程序中的调用上下文定向日志记录

Directing logging depending on call context in modular monolith web application

对于一些故事,我们曾经有一个微服务架构的应用程序,所有的服务都包含并使用一个公共的依赖库。后来决定,微服务方法是不合理的,而且开销大于收益,最终被重构为模块化单体。除了一个问题外,一切都很好而且很稳固。现在一切都被记录到一个地方,并且来自公共模块的日志条目不太明显 wrt 是代码的哪一部分调用了它。如果以前(微服务)结构是

service-a.log:
----
ServiceA: doing this
Common DB service: calling DB with x  <-- obviously called by service A
service-b.log:
----
ServiceB: doing that
Common DB service: calling DB with y <-- obviously called by service B

现在(使用单体)我们把所有东西都放在一个堆里

webapp.log:
----
ServiceA: doing this
ServiceB: doing that
Common DB service: calling DB with x  <-- called by what?
Common DB service: calling DB with y <-- called by what?

这并不理想。是的,我知道我可以使用线程名称进行跟踪,但如果在文件级别进行分离会更令人愉快。如何将服务 A 和服务 B 的日志定向到单独的文件是显而易见的。但是如何使用 Common DB 服务来实现呢?这可行吗?我正在寻找一种不会干扰服务本身的解决方案,即我仍然可以继续拥有像

这样简单的东西
@Slf4j
@Service
public class CommonDBService { ... }

服务中没有额外的日志记录配置逻辑

看来我的谷歌搜索能力让我失望了。解决方案是使用 Mapped Diagnostic Context,它允许将信息位与线程相关联。我通过创建一个高优先级过滤器将当前模块值放入 M​​DC,该过滤器提取并保存路径的第一段。 MDC 中的那部分信息如何用于定向到特定文件正在记录 backend-specific,但在使用 logback 的情况下,它是通过 SiftingAppender。