我正在尝试使用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目录中找到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作为包插件。发生此错误是因为log4j2-core的META中的资源,特别是log4jProvidoer.properties文件在log4j api中不可见。
谢谢!
发布于 2015-05-14 21:02:34
在激活器启动并开始搜索日志插件时,log4j核心包注册了一个包侦听器,如果发现了一些东西,它执行类似于通常的Logger初始化的一系列操作(我不确定它是否有效,但它似乎至少设置了Log4jContextSelector和LoggerContextFactory),您是否安装并启动了log4j核心包,并验证了什么都没有改变?
更新:
我做了一些测试,发现什么是log4j2 OSGi问题的可接受的解决方案/解决方案。但是,正如其他人所建议的那样,我也可以使用slf4j、pax日志记录或简单的OSGi日志服务(比较简单)。
@Grant,您有两个单独的东西需要修复:
1.正如您所描述的那样,“无法找到日志实现”错误是由于log4j2-api包无法找到log4j-provider.properties文件和造成的,在修复之后,log4j2-api无法找到log4j2-core类(这是一个不同的包,log4j2-api没有特定的导入包:对于这些类)。
解决这一问题的方法是为log4j2-api创建一个小片段包(我调用了mylog4j-apy-config.jar),其中包含了META-INF中的.properties文件和强制动态导入的清单:
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-api需要的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 jars,甚至不需要修改包来添加导入/导出),因此原始包和您自己的自定义包将保持不变。而且,它们也不依赖于原始包,它们只是带有清单和附加文本文件的基本jar存档,没有代码,不需要导入包或导出包。
您只需要在安装了每个片段的主机包之后安装它们。
我手动创建了两个片段,从一个空jar开始,然后在归档文件中复制属性文件,然后使用文本编辑器修改MANIFEST.MF,您可以使用这个pom.xml创建它们,记住复制pom.xml所在的log4jProvider.properties。
对于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配置的pom。
发布于 2015-05-05 07:26:55
Log4j不适合OSGi环境。幸运的是,替换的pax-测井有一个不错的下降。在您的包中,您使用了log4j api或任何其他受支持的api(我更喜欢slf4j-api)。然后将pax日志部署到您的OSGi框架和包中。可以使用标准log4j配置配置pax日志记录。因此,它非常容易使用。如果您想要一个非常简单的启动,只需安装阿帕奇卡拉夫并将您的包部署到它。Karaf已经包括了一个完全设置的pax日志记录。
发布于 2015-05-13 14:23:40
尝试更改jar文件的名称一些不包含核心单词的内容(例如:log4j-zore),然后再试一次。
https://stackoverflow.com/questions/30045873
复制相似问题