上一篇(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連接:
https://github.com/qindongliang/log_to_kafka
感興趣的朋友可以看下。
總結:
(1)方法一簡單快速,不支持json格式的輸出,打到kafka的消息都是原樣的log日志信息
(2)方法二稍微復雜,需要自己擴展log收集類,但支持json格式的數據輸出,對於想落地json數據直接到存儲系統中是非常適合的。
此外需要注意,在調試的時候log發送數據到kafka模式最好是同步模式的否則你控制台打印的數據很有可能不會被收集kafka中,程序就停止了。生產環境最好開啟異步發送數據模式,因為內部是批量的處理,所以能提升吞吐,但有一定的輕微延遲。
官網log4j-appender的源碼: