假设我有四个遗留罐子:
- 我的库.jar
- 我的应用程序.jar
- 我的其他应用程序.jar
- log4j.jar
“我的应用程序”和“我的其他应用程序”是不相关的应用程序,都具有 main() 函数。他们都使用“my-library-app”中的各种库函数。这三个都通过 log4j 进行日志记录(真的是 slf4j,但我只是想让示例保持简单)。
目前,这两个应用程序设置了两个不同的 log4j 配置文件,这导致它们登录到两个不同的文件。
现在我想把所有东西都转换成 OSGi。因此,我将前三个分别捆绑为一个单独的捆绑包,将实际应用程序的 main() 转换为 Activators,然后捆绑或找到现有的 log4j 捆绑包。我在同一个 OSGi 框架中启动这两个应用程序。
但是现在这两个不同的应用程序不再登录到不同的文件!正确的?只有一个 log4j 实例在 JVM 中运行,它从一个 log4j.properties 文件中获取其配置。
所以也许不是分别捆绑我的四个罐子,我做了三个捆绑:
- 我的图书馆
- 我的应用程序加 log4j
- 我的其他应用程序加 log4j
现在我可以为两个不同的应用程序获取不同的日志记录配置文件。但是来自我的图书馆的日志调用呢?My Library 捆绑包将锁定到 log4j 的两个副本之一,现在从 My Library 生成的所有日志消息都将出现在两个日志文件中的一个特定文件中 - 比如说我的应用程序中的那个。但即使它是我的图书馆由于来自我的其他应用程序的调用而发出的日志消息也是如此!他们会转到错误的日志文件。
所以也许捆绑:
- 我的图书馆加 log4j
- 我的应用程序加 log4j
- 我的其他应用程序加 log4j
现在,我的库中的日志消息将转到他们自己的日志文件,我想这比其中一些转到错误的应用程序的日志文件要好,但仍然不是很好。该文件包含来自两个应用程序的日志消息,并且打算用于任一应用程序的日志文件都没有来自这些应用程序的所有日志消息。
所以也许捆绑:
- 我的应用程序加我的库加 log4j
- 我的其他应用程序加上我的图书馆加上 log4j
但是现在 OSGi 的意义何在?我没有分享我的图书馆或 log4j 的使用。实际上,情况可能会更糟——我必须将一堆 jar 包粘贴到我所有的实际应用程序包中,这仅仅是因为我想查看它们的日志消息与导致它们的应用程序相关联。
所以也许备份并尝试不同的东西:我认为这在 log4j 中是不可能的,但在(比如说)slf4j 中我可以回到原来的捆绑计划:
- 我的图书馆
- 我的应用
- 我的其他应用
- 日志4j
然后我做一些事情,比如把 MDC 信息放在每个线程中,说明线程来自哪个应用程序。对该 MDC 信息做出反应以确定它进入哪个日志文件。
但好像也行不通!从我的应用程序中的某个线程调用我的库中的某个函数可能会导致从我的库中生成一个新线程,这不一定与该 MDC 相关联。
更糟糕的是:我的图书馆可能有一些线程被任何使用我的图书馆的应用程序共享,所以不可能与一些这样的标记相关联。
所以,总而言之,我被难住了。任何建议将不胜感激。提前致谢。