Log4J2在OSGi环境中未设置为记录器

2022-03-15 00:00:00 java log4j2 maven osgi
我使用Commons-Logging,它应该桥接到OSGi环境中的Log4J2,因此在pom.xml中添加了依赖项export-package和import-package,如下所示,但是记录器没有设置为Log4J2记录器。没有显示任何错误,但是在调试时,我发现它被设置为JDK14Logger。

    <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-jcl</artifactId>
            <version>2.8.2</version>
        </dependency>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>2.8.2</version>
        </dependency>

        <Export-Package>
            org.apache.logging.log4j.*,
            org.apache.commons.logging.*
        </Export-Package>
        <Import-Package>
            !org.apache.logging.log4j.*,
            !org.apache.commons.logging.*,
            *;resolution:=optional
        </Import-Package>

[更新]

从log4j用户邮件列表中,我可以看出这是因为ServiceLoader的非模块化性质。我在OSGi环境中查看了ServiceLoader的一些用法,以查找接口的实现,但仍然无法了解如何使其工作。

我也尝试了使用pax日志记录,但结果相同,只是记录器现在设置为JclLogger

OSGI

正如Christian在另一个答案中所说,最适合登录推荐答案的是pax-loging包。

Pax-Logging构建在SLF4J之上,可以使用不同的可能实现进行部署:

  • pax-logs-log4j2(Log4J2)
  • pax-Logging-Logback(Logback)

在我们使用pax-logging-service之前,pax-logging-service使用的是Log4J版本1,但不推荐使用,因为其他两个实现都运行良好。

我个人没有测试OSGI中的Logback实现,但Log4j2工作正常(有一些限制)。

此解决方案的好处之一是,您不能在捆绑包上导入任何日志记录实现,唯一需要做的事情是:

  • 声明slf4j-api为提供的依赖项(maven作用域)
  • 最终在maven中将slf4j-simple声明为测试作用域

您不需要调整有关记录任何捆绑包的任何maven-bundle-plugin选项。

以下是如何在ServiceMix版本7.0.1中执行此操作的步骤;此版本最初使用pax-loging-services,但下一步将显示需要更改的内容。

通过(紧接启动后)在Startup.properties中安装捆绑包,您可以确保所有库都在开始时加载。

这两个将替换pax-logging-apipax-logging-service的旧版本,替换为pax-logging-log4j2

mvn:org.ops4j.pax.logging/pax-logging-api/1.11.13 = 8
mvn:org.ops4j.pax.logging/pax-logging-log4j2/1.11.13 = 8

然后在文件中:org.ops4j.pax.logging.cfg只提到一行:

org.ops4j.pax.logging.log4j2.config.file=${karaf.etc}/log4j2.xml

并将log4j2.xml文件添加到${karaf.etc}文件夹(安装servicemix/etc)。

您必须复制${karaf.home}/system文件夹中的库。

这是在您只需要标准日志文件的情况下。

现在来看限制:如果您需要将日志生成为json文档,我只能在log4j2.xml中使用不推荐使用的JSONLayout

有关设置JSONLayout,请遵循my other answer。

简而言之:

startup.properties中添加三个Jackson依赖项:

mvn:com.fasterxml.jackson.core/jackson-annotations/2.12.4 = 6
mvn:com.fasterxml.jackson.core/jackson-core/2.12.4 = 6
mvn:com.fasterxml.jackson.core/jackson-databind/2.12.4 = 6

pax-logging-log4j2-extra(如果您使用的是log4j2实现):

mvn:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.13 = 6

在我的版本中,我必须在overrides.properties中添加以下三行:

mvn:com.fasterxml.jackson.core/jackson-core/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-databind/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-annotations/2.12.4;range="[2,3)"

我在github上使用servicemix 7.0.1创建了一个简单的docker-compose,使用两种创建json日志的方式(新的JsonTemplateLayout目前不起作用)。

相关文章