Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Log4j2 api在OSGi环境中找不到Log4j2核心_Java_Logging_Log4j_Osgi_Log4j2 - Fatal编程技术网

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

Java Log4j2 api在OSGi环境中找不到Log4j2核心,java,logging,log4j,osgi,log4j2,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 我发现在少数地方也讨论过同样的例外情况,但我仍然无法解决这个问题。Isu

我试图使用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>

org.apache.logging.log4j
log4japi
2.2
org.apache.logging.log4j
log4j型芯
2.2
我使用ApacheFelix作为捆绑插件。发生此错误的原因是log4j2核心的META-INF中的资源,特别是log4j-Provider.properties文件,对log4j api不可见


谢谢

Log4j不适合OSGi环境。幸运的是,有一个很好的替代品。在捆绑包中,您使用log4japi或任何其他受支持的api(我更喜欢slf4japi)。然后将pax日志部署到OSGi框架和包中。
您可以使用标准的log4j配置来配置pax日志记录。所以它很容易使用。如果您想要一个真正简单的开始,您可以简单地安装并部署您的捆绑包。Karaf已经包含了一个完全设置好的pax日志。

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

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


requirebundle:org.apache.logging.log4j.core;org.apache.logging.log4j.api

当启动Activator并开始搜索日志插件时,log4j core捆绑包注册一个捆绑包侦听器,如果发现了什么,它将执行一系列类似于通常的记录器初始化的操作(不是真正惯用的OSGi东西,我也不确定它是否有效,但它似乎至少设置了
Log4jContextSelector
LoggerContextFactory
),为了确定这一点,您是否安装并启动了log4j核心包,并验证没有任何更改

更新:

我做了一些测试,发现什么是log4j2 OSGi问题的可接受的解决方案/解决方法。但是,正如其他人建议的那样,我也可以使用slf4j、pax日志或简单的OSGi日志服务(这组中比较简单的)

@格兰特,你有两件事需要解决:

1。如您所述,“Log4j2无法找到日志实现”错误是由于
log4j2api
捆绑包无法找到log4j-provider.properties文件,修复后,
log4j2api
无法找到
Log4j2核心
类(它是一个不同的包,
log4j2api
没有特定的导入包:用于这些类)

解决方法是使用
META-INF
中的.properties文件和强制动态导入的清单为
log4j2 api
(我称之为mine 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核心
所需的
log4j2api
包的子集来改进它

这样,错误就会消失,但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>

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

对于我来说,此错误通过以下方式解决:

  • 在调用logger之前,确保log4j api捆绑包被实际激活,而不仅仅是解决了问题。我通过将其设置为低启动级别的自动启动来实现这一点
  • 让log4j api导入log4j core的类(如@uraime所述),以确保找到log4j core。最干净的方法是使用片段。您也可以将其添加到清单中,而不是动态导入:

    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
    
    需要捆绑包:org.apache.logging.log4j.core

我还为log4j core使用了一个片段,让它找到我的log4j2.xml配置文件,但是当不使用这个片段时,log4j将显示不同的错误消息


此外,我发现激活log4j核心捆绑包并不需要它(仅已解决)但请注意,这确实意味着Activator找不到定制的log4j2插件。

是否加载log4j core捆绑包?如何管理依赖关系?使用Maven?我在依赖关系中添加了log4j2 core和api。您可以指定您使用的框架吗?无法从另一个捆绑包上下文访问该属性文件,这是一种需要从-core加载它,请参阅我的初步答案。我使用的是Felix,OSGi环境基于Eclipse Equinox。实际上,如果我们在纯Eclipse Equinox环境中使用log4j2 OSGi捆绑包,那么它们就可以正常工作。我遇到这个异常是因为我使用的应用程序有一个定制的Equinox版本。因此请注意re对log4j2 OSGi最新捆绑包没有任何问题,因为它们在OSGi环境中正常工作。这不是一个好的选择,因为我问的问题是log4j2Log4j不是为OSGi构建的。