本文介紹了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環境中未設置為記錄器的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,