如何在karaf容器中實現log4j的日誌實時寫入kafka消息隊列

如何在karaf容器中實現log4j的日誌實時寫入kafka消息隊列

Log4j提供了AppenderSkeleton接口,提供給開發者實現自己的日誌追加功能。爲了實現將log4j日誌追加到
kafka消息中間件中,需要實現AppenderSkeleton,然後在log4j配置文件中增加如下配置:

log4j.rootLogger=INFO, async, kafka, osgi:*

log4j.appender.kafka=org.apache.kafka.log4jappender.KafkaLog4jAppender
log4j.appender.kafka.topic=test
log4j.appender.kafka.brokerList=localhost:9092
log4j.appender.kafka.compressionType=none
log4j.appender.kafka.syncSend=true
log4j.appender.kafka.layout=org.apache.log4j.PatternLayout
log4j.appender.kafka.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

這樣當log4j模塊啓動時,會加載KafkaLog4jAppender日誌追加類,KafkaLog4jAppender能夠監聽到日誌時間LoggintEvent,並做對應的處理。(寫入到kafka中)

對於maven工程,可以添以下兩個加依賴,安裝kafka-log4j-appender這個jar包。

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-log4j-appender</artifactId>
  <version>0.10.0.0</version>
</dependency>

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-clients</artifactId>
  <version>0.10.0.0</version>
</dependency>

但是,這樣實現是普通的java應用程序,如果要在karaf容器中實現,需要將karaf-log4j-appender jar包打包成bundle,由於karaf中使用過的是pax-logging-service這個bundle引入的log4j功能,但是並沒有將log4j包導出。而kafka-log4j-appender需要引用log4j包,所以只能通過Fragment-Bundle功能將kafka-log4j-appender依附於pax-logging-service的bundle。

將kafka-log4j-appender的jar包製作成Fragment-Bundle,只需要修改pom.xml文件
這裏寫圖片描述
這樣生成的bundle的元數據文件MANIFEST.MF內容如下:
這裏寫圖片描述
由此,成功製作kafka-log4j-appender的bundle文件。如何將這個bundle裝入到karaf,需要修改karaf容器的startup.properties,在mvn:org.ops4j.pax.logging/pax-logging-service/1.8.1 = 8 這個bundle前插入kafka的bundle安裝。
這裏寫圖片描述
然後,修改karaf容器的log4j配置文件org.ops4j.pax.logging.cfg 。添加kafka-log4j-appender的kafka配置。
這裏寫圖片描述
啓動kafka客戶端,可以收到karaf容器發送的日誌:
這裏寫圖片描述
大功告成!搞了一天終於搞定了,理解爲什麼要這樣做需要懂得karaf容器使用的osgi框架基礎知識,osgi的類加載機制等等。

同時主要參考的是karaf官網給得說明如下:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章