上一篇(http://qindongliang.iteye.com/blog/2354381 )寫了收集sparkstreaming的日誌進入kafka便於後續收集到es中快速統計分析,今天就再寫一篇如何在普通應用程序實時收集日誌,上一篇寫的畢竟是分佈式環境下的操做,有必定的特殊性,如MapReduce,Spark運行的日誌和普通項目的日誌是不太同樣的。java
所謂的普通程序就是web項目的或者非web項目的的程序,大部分都是單機版本的。linux
大多數時候,咱們的log都會輸出到本地的磁盤上,排查問題也是使用linux命令來搞定,若是web程序組成負載集羣,那麼就有多臺機器,若是有幾十臺機器,幾十個服務,那麼想快速定位log問題和排查就比較麻煩了,因此頗有必要有一個統一的平臺管理log,如今大多數公司的套路都是收集重要應用的log集中到kafka中,而後在分別導入到es和hdfs上,一個作實時檢索分析,另外一個作離線統計和數據備份。git
如何能快速收集應用日誌到kafka中?github
方法一:web
kafka官網已經提供了很是方便的log4j的集成包 kafka-log4j-appender,咱們只須要簡單配置log4j文件,就能收集應用程序log到kafka中。mongodb
#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的依賴包:apache
<dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>0.8.2.1</version> </dependency>
很是簡單,一個maven依賴加一個log4j配置文件便可,若是依然想寫入log到本地 文件依然也是能夠的,這種方式最簡單快速,可是默認的的log日誌是一行一行的純文本,有些場景下咱們可能須要json格式的數據。json
方法二:微信
重寫Log4jAppender,自定義輸出格式,支持json格式,若是是json格式的數據打入到kafka中,後續收集程序可能就很是方便了,直接拿到json就能入到mongodb或者es中,若是打入到kafka中的數據是純文本,那麼收集程序,可能須要作一些etl,解析其中的一些字段而後再入到es中,因此原生的輸出格式,可能稍不靈活,這樣就須要咱們本身寫一些類,而後達到靈活的程度,github鏈接:app
https://github.com/qindongliang/log_to_kafka
感興趣的朋友能夠看下。
總結:
(1)方法一簡單快速,不支持json格式的輸出,打到kafka的消息都是原樣的log日誌信息
(2)方法二稍微複雜,須要本身擴展log收集類,但支持json格式的數據輸出,對於想落地json數據直接到存儲系統中是很是適合的。
此外須要注意,在調試的時候log發送數據到kafka模式最好是同步模式的不然你控制檯打印的數據頗有可能不會被收集kafka中,程序就中止了。生產環境最好開啓異步發送數據模式,由於內部是批量的處理,因此能提高吞吐,但有必定的輕微延遲。
官網log4j-appender的源碼:
https://github.com/apache/kafka/tree/trunk/log4j-appender/src/test/java/org/apache/kafka/log4jappender 有什麼問題能夠掃碼關注微信公衆號:我是攻城師(woshigcs),在後臺留言諮詢。 技術債不能欠,健康債更不能欠, 求道之路,與君同行。