【问题标题】:Log4J2 not set as logger in OSGi environmentLog4J2 未在 OSGi 环境中设置为记录器
【发布时间】:2017-07-04 07:02:19
【问题描述】:

我正在使用应在 OSGi 环境中桥接到 Log4J2 的 commons-logging,因此在 pom.xml 中添加了依赖项、导出包和导入包,如下所示,但记录器未设置为 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

【问题讨论】:

    标签: java maven osgi log4j2


    【解决方案1】:

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

    Pax 日志是基于 SLF4J 构建的,可以使用不同的可能实现进行部署:

    • pax-logging-log4j2 (Log4J2)
    • pax-logging-logback (Logback)

    之前我们还使用了pax-logging-service,它使用的是 Log4J 版本 1,但由于其他两个实现效果很好,因此不推荐使用它。

    我个人没有在 OSGI 中测试过 Logback 实现,但是 Log4j2 可以工作(有一些限制)。

    这个解决方案的一个好处是你不能在你的包上导入任何日志实现,你唯一要做的就是:

    • 将 slf4j-api 声明为提供的依赖项(maven 范围)
    • 最终将 slf4j-simple 声明为 maven 中的测试范围

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

    以下是如何在 ServiceMix 版本 7.0.1 中执行此操作的步骤;此版本最初使用 pax-logging-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
    

    并在 ${karaf.etc} 文件夹中添加您的 log4j2.xml 文件(安装 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 目前不起作用)。

    【讨论】:

      【解决方案2】:

      如果上述内容在您的用户捆绑包中,则这是不正确的。 在您的用户包中,您应该简单地使用公共日志记录 API,而不是更改 maven 包插件的设置。

      然后它将为公共日志记录 API 创建 Import-Package 语句,但不会为您想要的 log4j 创建 Import-Package 语句。

      然后您应该在运行时安装合适的日志框架。我知道 pax-logging 可以以 OSGi 兼容的方式处理公共日志记录。也许普通的 log4j2 也可以,但我不确定。

      【讨论】:

      • 这与 Log4J 的实现方式相同,具有相关的依赖项、导出和导入包以及 commons-logging.properties。那行得通。现在我正在尝试将其更改为 log4j2。
      • 这可能以某种方式起作用,但它不正确并且可能会导致问题。您不应该将 log4j 运行时嵌入到您的包中。除其他外,正确部署 log4j(例如使用 pax-logging)允许在一个中心位置配置日志记录并在运行时更改它。
      • 用进一步的发现更新了问题。请参考。
      • 请尝试将 maven-bundle-plugin 设置保留为默认值,并在运行时使用 pax-logging。许多 apache 项目都使用这个。
      • Pax 日志有一个用于公共日志的内置适配器。只需在您的类中使用 commons 日志记录,pax 日志记录就会将其输入到它的 log4j 后端
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-15
      • 2016-04-10
      • 1970-01-01
      • 2018-02-26
      • 1970-01-01
      • 2017-05-24
      相关资源
      最近更新 更多