繁体   English   中英

使用嵌入式OSGi框架中的Log4j2

[英]Using Log4j2 from an embedded OSGi framework

我们使用Apache Felix (version 4.4.1)作为嵌入式OSGi框架。 提供框架的主要应用程序是使用Log4j2 (version 2.0.1)作为日志框架。 log4j-api和log4j-core存在依赖关系。 当然,当主应用程序启动时,还将加载和配置Log4j2。 主要部分中触发的所有日志消息都正确写入已配置的appender。

现在重点。 所有加载的bundle应该能够使用相同的配置,并且与主应用程序使用相同的LoggingContext。 我试图做的是提供所有Log4j2包(来自log4j2-api和log4j-core),将它们放入框架配置中,如org.osgi.framework.system.packages.extra 但是当加载bundle时,log4j2包不像其他提供的包那样出现在连接包列表中,当bundle类试图访问Log4j2类时,将抛出异常。

所有bundle都以相同的方式配置,并且在log4j2-api和log4j2-core上提供Log4j2依赖,并提供范围。 当我查看MANIFEST.MF时,使用的Log4j2包在Import-Packages部分中

所以我的问题是。

为什么以这种方式导出Log4j2包不起作用? 我如何配置我的环境,以便在捆绑包和主应用程序中使用相同的LoggingContext?

这是我在java代码中的OSGi框架的配置部分:

Map<String, String> temp = new HashMap<String, String>();
// setting parameter that the felix cache is new initialized on each
// start of the application
temp.put(org.osgi.framework.Constants.FRAMEWORK_STORAGE_CLEAN, "onFirstInit");
// setting the packages that are provided by the main system and can
// be used by the osgi bundles
temp.put(org.osgi.framework.Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
// have to export these explicitly as the automatic export does
// not work for this internal java packages
+ "com.sun.org.apache.xerces.internal.dom,"
+ "com.sun.org.apache.xerces.internal.jaxp,"
+ "com.sun.org.apache.xerces.internal.util,"
// export the looging packages
+ "org.apache.log4j," + "org.apache.logging.log4j," +   "org.apache.logging.log4j.message,"
+ "org.apache.logging.log4j.simple," + "org.apache.logging.log4j.spi,"
+ "org.apache.logging.log4j.status," + "org.apache.logging.log4j.util,"
+ "org.apache.logging.log4j.impl," + "org.apache.logging.log4j.appender,"
+ "org.apache.logging.log4j.appender.db," + "org.apache.logging.log4j.appender.db.jdbc,"
+ "org.apache.logging.log4j.appender.db.jpa," + "org.apache.logging.log4j.appender.db.jpa.converter,"
+ "org.apache.logging.log4j.appender.jms," + "org.apache.logging.log4j.appender.rewrite,"
+ "org.apache.logging.log4j.appender.rolling," + "org.apache.logging.log4j.appender.rolling.action,"
+ "org.apache.logging.log4j.appender.routing," + "org.apache.logging.log4j.async,"
+ "org.apache.logging.log4j.config," + "org.apache.logging.log4j.config.json,"
+ "org.apache.logging.log4j.config.plugins," + "org.apache.logging.log4j.config.plugins.osgi,"
+ "org.apache.logging.log4j.config.plugins.processor,"
+ "org.apache.logging.log4j.config.plugins.util," + "org.apache.logging.log4j.config.plugins.visitors,"
+ "org.apache.logging.log4j.config.status," + "org.apache.logging.log4j.config.xml,"
+ "org.apache.logging.log4j.config.yaml," + "org.apache.logging.log4j.filter,"
+ "org.apache.logging.log4j.impl," + "org.apache.logging.log4j.jackson,"
+ "org.apache.logging.log4j.jmx," + "org.apache.logging.log4j.layout,"
+ "org.apache.logging.log4j.lookup," + "org.apache.logging.log4j," + "org.apache.logging.log4j.net,"
+ "org.apache.logging.log4j.net.jms," + "org.apache.logging.log4j.net.server,"
+ "org.apache.logging.log4j.net.ssl," + "org.apache.logging.log4j.pattern,"
+ "org.apache.logging.log4j.selector," + "org.apache.logging.log4j.tools,"
+ "org.apache.logging.log4j.util," + "sun.misc," + "javax.jms," + "javax.mail,"
+ "javax.mail.internet," + "javax.mail.util," + "javax.persistence," + "javax.servlet,"
+ "com.sun.xml.internal.bind");
temp.put(FelixConstants.LOG_LEVEL_PROP, "4");
OSGI_CONFIG = Collections.unmodifiableMap(temp);

捆绑包中对log4j2库的依赖关系定义如下:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.0.1</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.0.1</version>
    <scope>provided</scope>
</dependency>

我们找到了一个适用于版本2.0.1的解决方案。 我们已经将它们添加到DynamicImport-Package定义中,而不是在MANIFEST.MF的Import-Package部分中设置所需的log4j包。 之后,在需要时动态连接类,并且所有OSGi包都可以使用相同的LoggerContext。

我有一个log4j2在osgi中工作,配置相对简单。

您必须创建两个片段。

  • 第一个片段应该有log4j-api作为主机。 它应该包含一个文件:META-INF / log4j-providers.properties(从log4j2-core中取出它)
  • 第二个片段应该有log4j-core作为主机。 它应该包含一个文件:log4j2.xml(或任何你想要的配置文件)

这只需将log4j-api和log4j-core jar文件放入plugins目录(如果使用equinox,则为p2)。 我有以下链条工作得很漂亮:

commons-logging(jcl-over-slf4j) - > slf4j(slf4j-api) - > log4j-slf4-impl - > log4j-api - > log4j-core。

注意:slf4j版本1.7.7 log4j2版本2.1

我在OSGi(Eclipse)中运行log4j。

正如@Fenris Ulth所提到的,您可以为包含log4j2.xml配置文件的log4j-core创建一个片段。 使用log4j2版本2.3我发现在我的代码开始使用log4j来记录消息之前我必须激活log4j-api包,否则我得到了这里描述的错误 我通过将其设置为低启动级别的自动启动来完成此操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM