Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging OSGi从遗留应用程序进行日志记录?_Logging_Log4j_Osgi_Slf4j_Legacy - Fatal编程技术网

Logging OSGi从遗留应用程序进行日志记录?

Logging OSGi从遗留应用程序进行日志记录?,logging,log4j,osgi,slf4j,legacy,Logging,Log4j,Osgi,Slf4j,Legacy,假设我有四个遗留罐: my-library.jar my-app.jar my-other-app.jar log4j.jar “我的应用程序”和“我的其他应用程序”是不相关的应用程序,它们都具有main()函数。它们都使用“我的图书馆应用程序”中的各种图书馆功能。这三个都是通过log4j进行日志记录的(实际上是slf4j,但我只想让示例保持简单) 目前,这两个应用程序使用两个不同的log4j配置文件进行设置,这会导致它们登录到两个不同的文件 现在我想把所有东西都转换成OSGi。因此,我将前三个

假设我有四个遗留罐:

  • my-library.jar
  • my-app.jar
  • my-other-app.jar
  • log4j.jar
  • “我的应用程序”和“我的其他应用程序”是不相关的应用程序,它们都具有main()函数。它们都使用“我的图书馆应用程序”中的各种图书馆功能。这三个都是通过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关联

    更糟糕的是:我的库可能有一些线程被任何使用我的库的应用程序共享,因此不可能与这样的标记关联


    总之,我被难住了。如有任何建议,将不胜感激。提前谢谢。

    如果我理解正确:

    • 您曾经有两个完全独立的应用程序,运行在不同的JVM中。他们确实共享一个库,但仅在文件系统级别,应用程序彼此都不知道
    • 现在,您使用一个JVM,应用程序相互干扰(目前为log4j,但可能还有其他问题),您希望使用OSGi来解决这个问题
    我认为问题在于,您使用OSGi作为应用程序容器,就像servlet容器一样,它将隔离不同的应用程序。您希望MyLibrary“属于”MyApp或MyOther app。就我所见,您真的不希望这些应用程序共享任何东西,只是为了在单个JVM中玩得更好

    这并不是OSGi的真正用途,但我可以想到一些可能性:

    • 新的OSGi规范确实支持这一点(称为子系统),但它非常新,对于您的用例来说可能有点太复杂了,据我所知,还没有实现。我现在不建议走这条路

    • 您可以复制Bundle,如果您给它们一个不同的符号名,您可以使用requirebundle依赖于特定的Bundle。那我觉得应该行得通,但坦率地说,我觉得这有点愚蠢。OSGi然后什么都不添加,只是使内容复杂化,因为最终会得到许多几乎相同的捆绑包

    • 您可以在单个JVM中启动两个OSGi实例,每个实例都有自己的捆绑包集。这应该以一种优雅的方式将您的两个应用程序分开(查看Neil的答案)。运行多个OSGi实例非常轻量级,您可以使用相同的包(在文件系统级别),如果您确实想共享代码,可以将这些包添加到org.OSGi.framework.system.packages.extra属性中。我想这是你最好的选择

    • 最后,一些OSGi容器以专有方式支持这一点,如EclipseVirgo和ApacheKaraf。(在处女座称为“计划”,在处女座称为“实例”)。这可能值得一看,这取决于你的情况

    希望有帮助


    弗兰克

    如果我理解正确:

    • 您曾经有两个完全独立的应用程序,运行在不同的JVM中。他们确实共享一个库,但仅在文件系统级别,应用程序彼此都不知道
    • 现在,您使用一个JVM,应用程序相互干扰(目前为log4j,但可能还有其他问题),您希望使用OSGi来解决这个问题