Gra*_*ant 7 java logging osgi log4j 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
Run Code Online (Sandbox Code Playgroud)
我发现在很少的地方讨论了同样的例外,但我仍然无法弄清楚这个问题.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>
Run Code Online (Sandbox Code Playgroud)
我使用apache felix作为bundle插件.发生此错误的原因是log4j2-core的META-INF内部的资源特别是log4j-providoer.properties文件对log4j api不可见.
谢谢!
当启动Activator并开始搜索日志插件时,log4j-core包会注册一个bundle监听器,如果找到了什么,它会执行一系列与通常的Logger初始化类似的操作(不是真正的惯用OSGi东西,我不确定它工作,但它似乎至少设置Log4jContextSelector和LoggerContextFactory),只是为了确保它,你安装和启动log4j核心包并验证没有改变?
更新:
我做了一些测试,发现log4j2 OSGi问题的可接受解决方案/解决方法是什么.但正如其他人推荐的那样,或者我会使用slf4j,pax-logging或简单的OSGi日志服务(更简单的一堆).
@Grant,你有2件需要修复的东西:
1.正如您所描述的那样,"Log4j2无法找到日志记录实现"错误是由于log4j2-apibundle无法找到log4j-provider.properties文件,并且在修复后log4j2-api无法找到log4j2-core类(它是一个不同的bundle并log4j2-api没有特定的Import-Package:对于那些类).
解决方法是log4j2-api使用该.properties文件创建一个小片段包(我称之为我的log4j-api-config.jar),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: *
Run Code Online (Sandbox Code Playgroud)
我在这里导入*,你可以改进它添加所需的log4j2-core软件包子集log4j2-api.
有了这个,这个错误就会消失,但是log4j会注意到你没有提供log4j2配置文件,接下来要修复(只有在这种情况下你才关心).
2.此时菲利克斯将展示:
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.
Run Code Online (Sandbox Code Playgroud)
我想你可能想要添加自己的log4j2.xml而不会弄乱原版log4j2-core.jar.您可以创建另一个片段包,这次由托管log4j2-core,只需一个root4中的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
Run Code Online (Sandbox Code Playgroud)
我在测试期间使用了这个简单的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>
Run Code Online (Sandbox Code Playgroud)
有了这个,您将不再需要下面描述的那种"桥接"捆绑包,而您只需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>
Run Code Online (Sandbox Code Playgroud)
在适当的位置修改此pom(包含文件,包名称)以生成具有log4j2-core配置的另一个pom .