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