Log4j2 API在OSGi环境中找不到Log4j2内核

授予

我正在尝试使用log4j2 OSGi捆绑软件,但似乎log4j2 api在OSGi环境中找不到log4j2核心。我不断收到以下异常:

ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console

我在几个地方都发现了相同的例外,但是仍然无法弄清楚这个问题。我怀疑出现此问题是因为log4j2 api在log4j2核心的META-INF目录内找不到log4j-provider.properties。是否有任何线索为什么我会收到此异常以及如何解决该问题?(如果有人有正确的pom文件来添加log4j依赖项并进行捆绑,请与我共享)

这些是我使用的依赖

    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.2</version>
    </dependency>

我使用apache felix作为捆绑插件。发生此错误是因为log4j api不可见log4j2核心的META-INF中的资源,特别是log4j-providoer.properties文件。

谢谢!

翁贝托·雷蒙迪(Umberto Raimondi)

log4j-core捆绑软件在启动Activator时会注册一个捆绑软件侦听器,并开始搜索日志插件,如果发现某些内容,它将执行类似于通常Logger初始化的一系列操作(不是真正的OSGi东西,我不确定可以,但似乎至少设置了Log4jContextSelectorLoggerContextFactory),只是为了确定这一点,您是否安装启动了log4j-core捆绑软件并确认没有任何更改?

更新:

我进行了一些测试,发现有什么可以解决log4j2 OSGi问题的解决方案。但是,正如其他人所建议的那样,或者我将使用slf4j,pax日志记录或仅使用OSGi日志服务(这是其中最简单的一种)。

@Grant,您有两个需要修复的独立问题:

1.正如你所描述的,“Log4j2无法找到日志实现”错误是由事实造成的log4j2-api包是无法找到log4j-provider.properties文件,是固定后,log4j2-api找不到log4j2-core类(这是一个不同的捆绑软件,log4j2-api并且没有特定的Import-Package:针对这些类)。

解决方法是为该文件创建一个小片段捆绑包log4j2-api(我称为mine log4j-api-config.jar),其中包含该.properties文件META-INF和一个用于强制动态导入的清单:

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Log4j API configurator
    Bundle-SymbolicName: org.apache.logging.log4j.apiconf
    Bundle-Version: 1.0.0
    Bundle-Vendor: None
    Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2
    Fragment-Host: org.apache.logging.log4j.api
    DynamicImport-Package: *

我在这里导入*,您可以通过添加所需的必需log4j2-core软件包子集来对其进行改进log4j2-api

这样,该错误将消失,但是log4j会注意到您没有提供log4j2配置文件,这是下一个要修复的问题(仅在这种情况下需要注意)。

2.此时,Felix将显示以下内容:

log4j2.xml not found by org.apache.logging.log4j.core
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.

我想您可能想添加自己的log4j2.xml而不弄乱原来的log4j2-core.jar您可以执行此操作以创建另一个片段捆绑包,这次由托管log4j2-core在根目录中只有一个log4j2.xml配置文件和一个简单的清单:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Log4j Core configurator
Bundle-SymbolicName: org.apache.logging.log4j.coreconf
Bundle-Version: 1.0.0
Bundle-Vendor: None
Bundle-RequiredExecutionEnvironment: OSGi/Minimum-1.2
Fragment-Host: org.apache.logging.log4j.core

在测试期间使用了以下简单的log4j2.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
  <Appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
  </Appenders>
  <Loggers>
    <Root level="info">
      <AppenderRef ref="Console"/>
    </Root>
  </Loggers>
</Configuration>

有了这个,您将不再需要下面描述的那种“桥接”捆绑软件,而只需Import-Package: org.apache.logging.log4j要从捆绑软件中简单使用log4j。

更新2:

重要的是要注意,这两个片段不是原始捆绑软件的依赖项(无需修改log4j jar或什至您的捆绑软件以添加导入/导出),因此原始捆绑软件和您自己的自定义捆绑软件将保持不变。而且,它们也不依赖于原始包,它们只是带有清单和附加文本文件的基本jar存档,没有代码,不需要Import-Package或Export-Package。

您只需在安装了主机捆绑包之后安装每个片段。

我已经从一个空的jar开始手动创建了这两个片段,并在存档中复制了属性文件,并使用文本编辑器修改了MANIFEST.MF,您可以使用此pom.xml来创建它们,记住要复制log4j-provider.properties pom.xml所在的位置。

对于log4j2-api片段:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>my.group</groupId>
    <artifactId>log4j2-api-config</artifactId>
    <version>1.0</version>
    <name>log4j2-api-config</name>
    <packaging>bundle</packaging>
    <properties>
        <java-version>1.7</java-version>
    </properties>

    <dependencies>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.0.0</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>org.apache.logging.log4j.apiconf</Bundle-SymbolicName>
                        <Bundle-Name>Log4j API Configurator</Bundle-Name>
                        <Bundle-Version>1.0.0</Bundle-Version>
                        <Fragment-Host>org.apache.logging.log4j.api</Fragment-Host>
                        <DynamicImport-Package>
                            *;resolution:=optional
                        </DynamicImport-Package>
                    </instructions>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>.</directory>
                <includes>
                    <include>log4j-provider.properties</include>
                </includes>
                <targetPath>META-INF</targetPath>
            </resource>
        </resources>
    </build>
</project>

在适当的地方修改此pom(包括文件,捆绑包名称),以使用log4j2-core配置生成另一个

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章