本文介紹了Log4J2在OSGi環(huán)境中未設(shè)置為記錄器的處理方法,對(duì)大家解決問(wèn)題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問(wèn)題描述
我使用Commons-Logging,它應(yīng)該橋接到OSGi環(huán)境中的Log4J2,因此在pom.xml
中添加了依賴(lài)項(xiàng)export-package和import-package,如下所示,但是記錄器沒(méi)有設(shè)置為L(zhǎng)og4J2記錄器。沒(méi)有顯示任何錯(cuò)誤,但是在調(diào)試時(shí),我發(fā)現(xiàn)它被設(shè)置為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用戶(hù)郵件列表中,我可以看出這是因?yàn)镾erviceLoader的非模塊化性質(zhì)。我在OSGi環(huán)境中查看了ServiceLoader的一些用法,以查找接口的實(shí)現(xiàn),但仍然無(wú)法了解如何使其工作。
我也嘗試了使用pax日志記錄,但結(jié)果相同,只是記錄器現(xiàn)在設(shè)置為JclLogger
OSGI
正如Christian在另一個(gè)答案中所說(shuō),最適合登錄推薦答案的是pax-loging包。
Pax-Logging構(gòu)建在SLF4J之上,可以使用不同的可能實(shí)現(xiàn)進(jìn)行部署:
pax-logs-log4j2(Log4J2)
pax-Logging-Logback(Logback)
在我們使用pax-logging-service
之前,pax-logging-service
使用的是Log4J版本1,但不推薦使用,因?yàn)槠渌麅蓚€(gè)實(shí)現(xiàn)都運(yùn)行良好。
我個(gè)人沒(méi)有測(cè)試OSGI中的Logback實(shí)現(xiàn),但Log4j2工作正常(有一些限制)。
此解決方案的好處之一是,您不能在捆綁包上導(dǎo)入任何日志記錄實(shí)現(xiàn),唯一需要做的事情是:
聲明slf4j-api為提供的依賴(lài)項(xiàng)(maven作用域)
最終在maven中將slf4j-simple聲明為測(cè)試作用域
您不需要調(diào)整有關(guān)記錄任何捆綁包的任何maven-bundle-plugin選項(xiàng)。
以下是如何在ServiceMix版本7.0.1中執(zhí)行此操作的步驟;此版本最初使用pax-loging-services,但下一步將顯示需要更改的內(nèi)容。
通過(guò)(緊接啟動(dòng)后)在Startup.properties中安裝捆綁包,您可以確保所有庫(kù)都在開(kāi)始時(shí)加載。
這兩個(gè)將替換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)。
您必須復(fù)制${karaf.home}/system
文件夾中的庫(kù)。
這是在您只需要標(biāo)準(zhǔn)日志文件的情況下。
現(xiàn)在來(lái)看限制:如果您需要將日志生成為json文檔,我只能在log4j2.xml中使用不推薦使用的JSONLayout
。
有關(guān)設(shè)置JSONLayout
,請(qǐng)遵循my other answer。
簡(jiǎn)而言之:
在startup.properties
中添加三個(gè)Jackson依賴(lài)項(xiàng):
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實(shí)現(xiàn)):
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創(chuàng)建了一個(gè)簡(jiǎn)單的docker-compose,使用兩種創(chuàng)建json日志的方式(新的JsonTemplateLayout目前不起作用)。
這篇關(guān)于Log4J2在OSGi環(huán)境中未設(shè)置為記錄器的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,