Log4j2 api在OSGi环境中找不到Log4j2核心

时间:2015-05-05 06:41:00

标签: java logging log4j 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

我发现在很少的地方讨论了同样的例外,但我仍然无法弄清楚这个问题。 Isuspect我遇到了这个问题,因为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作为bundle插件。发生此错误的原因是log4j2-core的META-INF内部的资源特别是log4j-providoer.properties文件对log4j api不可见。

谢谢!

4 个答案:

答案 0 :(得分:7)

当启动Activator并开始搜索日志插件时,log4j-core软件包会注册一个bundle侦听器,如果发现了某些内容,它会执行一系列类似于通常的Logger初始化的操作(不是真正的惯用OSGi内容和i&#39 ;我不确定它是否有效,但它似乎设置了至少Log4jContextSelectorLoggerContextFactory),为了确保它,你安装启动log4j-core捆绑并验证没有变化?

<强>更新

我做了一些测试,发现了log4j2 OSGi问题的可接受解决方案/解决方法。但正如别人推荐的那样,或者我会使用slf4j,pax-logging或简单的OSGi Log Service(更简单的一堆)。

@Grant,你需要修复两件事:

1。如您所述,&#34; Log4j2无法找到日志记录实施&#34;错误是由于log4j2-api包无法找到 log4j-provider.properties 文件,然后修复了log4j2-api }找不到log4j2-core类(它是一个不同的包,log4j2-api没有特定的导入包:对于这些类。

解决这个问题的方法是使用log4j2-api中的.properties文件和强制动态的清单为META-INF创建一个小片段包(我称之为我的log4j-api-config.jar)输入:

    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>

有了这个,你就不需要那种&#34;桥梁&#34;将您下面描述的内容捆绑在一起,并且您只需要一个简单的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配置的另一个。

答案 1 :(得分:0)

Log4j不适合OSGi环境。幸运的是,替换pax-logging有一个很好的下降。在你的包中你使用log4j api或任何其他支持的apis(我更喜欢slf4j-api)。然后,将pax日志记录部署到OSGi框架和捆绑包。 您可以使用标准log4j配置配置pax日志记录。所以它很容易使用。如果您想要一个非常简单的开始,您只需安装apache karaf并将您的捆绑包部署到它。 Karaf已经包含了一个完整的pax日志记录。

答案 2 :(得分:0)

尝试更改jar文件的名称,不包含核心词(例如:log4j-zore),然后重试

答案 3 :(得分:0)

您需要在META-INF/MANIFEST.MF中通过添加以下依赖项来指定与您的捆绑包相关的OSGI依赖项:

Require-Bundle: org.apache.logging.log4j.core;org.apache.logging.log4j.api