如何收集專案日誌統一發送到kafka中?
上一篇(http://qindongliang.iteye.com/blog/2354381 )寫了收集sparkstreaming的日誌進入kafka便於後續收集到es中快速統計分析,今天就再寫一篇如何在普通應用程式實時收集日誌,上一篇寫的畢竟是分散式環境下的操作,有一定的特殊性,如MapReduce,Spark執行的日誌和普通專案的日誌是不太一樣的。
所謂的普通程式就是web專案的或者非web專案的的程式,大部分都是單機版本的。
大多數時候,我們的log都會輸出到本地的磁碟上,排查問題也是使用linux命令來搞定,如果web程式組成負載叢集,那麼就有多臺機器,如果有幾十臺機器,幾十個服務,那麼想快速定位log問題和排查就比較麻煩了,所以很有必要有一個統一的平臺管理log,現在大多數公司的套路都是收集重要應用的log集中到kafka中,然後在分別匯入到es和hdfs上,一個做實時檢索分析,另一個做離線統計和資料備份。
如何能快速收集應用日誌到kafka中?
方法一:
kafka官網已經提供了非常方便的log4j的整合包 kafka-log4j-appender,我們只需要簡單配置log4j檔案,就能收集應用程式log到kafka中。
#log4j.rootLogger=WARN,console,kafka
log4j.rootLogger=INFO,console
# for package com.demo.kafka, log would be sent to kafka appender.
#log4j.logger.com.bigdata.xuele.streaming.SparkStreamingKmd*= info,kafka
# appender kafka
log4j.appender.kafka=kafka.producer.KafkaLog4jAppender
log4j.appender.kafka.topic=${kafka.log.topic}
# multiple brokers are separated by comma ",".
log4j.appender.kafka.brokerList=${kafka.log.brokers}
log4j.appender.kafka.compressionType=none
log4j.appender.kafka.syncSend=false
log4j.appender.kafka.layout =org.apache.log4j.PatternLayout
#log4j.appender.kafka.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
log4j.appender.kafka.layout.ConversionPattern=[%d] %p %m (%c)%n
# appender console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
#log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%n
log4j.appender.console.layout.ConversionPattern=[%d] [%p] [%t] %m%n
log4j.logger.org.eclipse.jetty=WARN
log4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
注意,需要引入maven的依賴包:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>0.8.2.1</version>
</dependency>
非常簡單,一個maven依賴加一個log4j配置檔案即可,如果依然想寫入log到本地 檔案依然也是可以的,這種方式最簡單快速,但是預設的的log日誌是一行一行的純文字,有些場景下我們可能需要json格式的資料。
方法二:
重寫Log4jAppender,自定義輸出格式,支援json格式,如果是json格式的資料打入到kafka中,後續收集程式可能就非常方便了,直接拿到json就能入到mongodb或者es中,如果打入到kafka中的資料是純文字,那麼收集程式,可能需要做一些etl,解析其中的一些欄位然後再入到es中,所以原生的輸出格式,可能稍不靈活,這樣就需要我們自己寫一些類,然後達到靈活的程度,github連線:
感興趣的朋友可以看下。
總結:
(1)方法一簡單快速,不支援json格式的輸出,打到kafka的訊息都是原樣的log日誌資訊
(2)方法二稍微複雜,需要自己擴充套件log收集類,但支援json格式的資料輸出,對於想落地json資料直接到儲存系統中是非常適合的。
此外需要注意,在除錯的時候log傳送資料到kafka模式最好是同步模式的否則你控制檯列印的資料很有可能不會被收集kafka中,程式就停止了。生產環境最好開啟非同步傳送資料模式,因為內部是批量的處理,所以能提升吞吐,但有一定的輕微延遲。
官網log4j-appender的原始碼:
有什麼問題可以掃碼關注微信公眾號:我是攻城師(woshigcs),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。