比方说,我有四个传统的罐子:从传统应用程序OSGi日志记录?
- 我-library.jar
- 我-app.jar
- 我-其他-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 App的日志文件。但即使它是来自我的图书馆的日志消息,也是如此,因为来自我的其他应用程序的呼叫!他们会去错误的日志文件。
所以也许捆绑:
- 我的图书馆加上log4j的
- 我的应用加上log4j的
- 我的其他应用程序加log4j的
现在从我的音乐库中的日志消息要自己自己的日志文件,我认为它比其中一些去错了应用程序的日志文件更好,但仍然不是很好。该文件包含来自两个应用程序的日志消息,并且任何旨在用于任一应用程序的日志文件都不具有来自这些应用程序的所有日志消息。
所以也许捆绑:
- 我的应用加上我的图书馆加log4j的
- 我的其他应用程序加上我的图书馆加log4j的
但现在什么是OSGi的点?我没有分享我的书库或log4j的使用。而在现实中,它可能会更糟 - 会有一堆,我要坚持的多个副本到我所有的实际应用捆绑的,只是因为我想看到的是使他们的应用程序相关的日志消息罐子。
所以也许备份和尝试不同的东西:我不认为这是可能的log4j的,但在(比如说)SLF4J我能回到原来的捆绑计划:
- 我的图书馆
- 我的应用
- 我的其他应用程序
- log4j的
然后我做这样的事情在每个线程把MDC信息说什么AP线程来自。响应该MDC信息以确定它所进入的日志文件。
但好像是不会工作!从我的应用程序中的某个线程调用我的库中的某个函数可能会导致从我的库中生成一个新线程,该线程不一定与该MDC相关联。
而且它比这更糟糕:我的图书馆可能有一些线程是由使用我的库中的任何应用程序共享,因此不可能用一些这样的标记关联。
所以,一切的一切,我很为难。任何建议将不胜感激。提前致谢。
本文相关:https://www.tibcommunity.com/blogs/OSGi/2012/06/08/do-we-really-need-subsystems – 2012-08-08 08:55:25