Log4J2 not set as logger in OSGi environment(Log4J2在OSGi环境中未设置为记录器)
问题描述
我使用Commons-Logging,它应该桥接到OSGi环境中的Log4J2,因此在pom.xml
中添加了依赖项export-package和import-package,如下所示,但是记录器没有设置为Log4J2记录器。没有显示任何错误,但是在调试时,我发现它被设置为JDK14Logger。
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-jcl</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>2.8.2</version>
</dependency>
<Export-Package>
org.apache.logging.log4j.*,
org.apache.commons.logging.*
</Export-Package>
<Import-Package>
!org.apache.logging.log4j.*,
!org.apache.commons.logging.*,
*;resolution:=optional
</Import-Package>
[更新]
从log4j用户邮件列表中,我可以看出这是因为ServiceLoader的非模块化性质。我在OSGi环境中查看了ServiceLoader的一些用法,以查找接口的实现,但仍然无法了解如何使其工作。
我也尝试了使用pax日志记录,但结果相同,只是记录器现在设置为JclLogger
OSGI
正如Christian在另一个答案中所说,最适合登录推荐答案的是pax-loging包。
Pax-Logging构建在SLF4J之上,可以使用不同的可能实现进行部署:
- pax-logs-log4j2(Log4J2)
- pax-Logging-Logback(Logback)
在我们使用pax-logging-service
之前,pax-logging-service
使用的是Log4J版本1,但不推荐使用,因为其他两个实现都运行良好。
我个人没有测试OSGI中的Logback实现,但Log4j2工作正常(有一些限制)。
此解决方案的好处之一是,您不能在捆绑包上导入任何日志记录实现,唯一需要做的事情是:
- 声明slf4j-api为提供的依赖项(maven作用域)
- 最终在maven中将slf4j-simple声明为测试作用域
您不需要调整有关记录任何捆绑包的任何maven-bundle-plugin选项。
以下是如何在ServiceMix版本7.0.1中执行此操作的步骤;此版本最初使用pax-loging-services,但下一步将显示需要更改的内容。
通过(紧接启动后)在Startup.properties中安装捆绑包,您可以确保所有库都在开始时加载。
这两个将替换pax-logging-api
和pax-logging-service
的旧版本,替换为pax-logging-log4j2
:
mvn:org.ops4j.pax.logging/pax-logging-api/1.11.13 = 8
mvn:org.ops4j.pax.logging/pax-logging-log4j2/1.11.13 = 8
然后在文件中:org.ops4j.pax.logging.cfg
只提到一行:
org.ops4j.pax.logging.log4j2.config.file=${karaf.etc}/log4j2.xml
并将log4j2.xml文件添加到${karaf.etc}文件夹(安装servicemix/etc)。
您必须复制${karaf.home}/system
文件夹中的库。
这是在您只需要标准日志文件的情况下。
现在来看限制:如果您需要将日志生成为json文档,我只能在log4j2.xml中使用不推荐使用的JSONLayout
。
有关设置JSONLayout
,请遵循my other answer。
简而言之:
在startup.properties
中添加三个Jackson依赖项:
mvn:com.fasterxml.jackson.core/jackson-annotations/2.12.4 = 6
mvn:com.fasterxml.jackson.core/jackson-core/2.12.4 = 6
mvn:com.fasterxml.jackson.core/jackson-databind/2.12.4 = 6
和pax-logging-log4j2-extra
(如果您使用的是log4j2实现):
mvn:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.13 = 6
在我的版本中,我必须在overrides.properties
中添加以下三行:
mvn:com.fasterxml.jackson.core/jackson-core/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-databind/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-annotations/2.12.4;range="[2,3)"
我在github上使用servicemix 7.0.1创建了一个简单的docker-compose,使用两种创建json日志的方式(新的JsonTemplateLayout目前不起作用)。
这篇关于Log4J2在OSGi环境中未设置为记录器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Log4J2在OSGi环境中未设置为记录器
基础教程推荐
- 如何强制对超级方法进行多态调用? 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 在螺旋中写一个字符串 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01