我正在尝试使用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文件。
谢谢!
log4j-core捆绑软件在启动Activator时会注册一个捆绑软件侦听器,并开始搜索日志插件,如果发现某些内容,它将执行类似于通常Logger初始化的一系列操作(不是真正的OSGi东西,我不确定可以,但似乎至少设置了Log4jContextSelector
和LoggerContextFactory
),只是为了确定这一点,您是否安装并启动了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] 删除。
我来说两句