
上一篇(http://qindongliang.iteye.com/blog/2354381 )寫了收集sparkstreaming的日志進(jìn)入kafka便于后續(xù)收集到es中快速統(tǒng)計(jì)分析,今天就再寫一篇如何在普通應(yīng)用程序?qū)崟r(shí)收集日志,上一篇寫的畢竟是分布式環(huán)境下的操作,有一定的特殊性,如MaPReduce,Spark運(yùn)行的日志和普通項(xiàng)目的日志是不太一樣的。
所謂的普通程序就是web項(xiàng)目的或者非web項(xiàng)目的的程序,大部分都是單機(jī)版本的。
大多數(shù)時(shí)候,我們的log都會(huì)輸出到本地的磁盤上,排查問(wèn)題也是使用linux命令來(lái)搞定,如果web程序組成負(fù)載集群,那么就有多臺(tái)機(jī)器,如果有幾十臺(tái)機(jī)器,幾十個(gè)服務(wù),那么想快速定位log問(wèn)題和排查就比較麻煩了,所以很有必要有一個(gè)統(tǒng)一的平臺(tái)管理log,現(xiàn)在大多數(shù)公司的套路都是收集重要應(yīng)用的log集中到kafka中,然后在分別導(dǎo)入到es和hdfs上,一個(gè)做實(shí)時(shí)檢索分析,另一個(gè)做離線統(tǒng)計(jì)和數(shù)據(jù)備份。
如何能快速收集應(yīng)用日志到kafka中?
方法一:
kafka官網(wǎng)已經(jīng)提供了非常方便的log4j的集成包 kafka-log4j-appender,我們只需要簡(jiǎn)單配置log4j文件,就能收集應(yīng)用程序log到kafka中。
#log4j.rootLogger=WARN,console,kafkalog4j.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 kafkalog4j.appender.kafka=kafka.producer.KafkaLog4jAppenderlog4j.appender.kafka.topic=${kafka.log.topic}# multiple brokers are separated by comma ",".log4j.appender.kafka.brokerList=${kafka.log.brokers}log4j.appender.kafka.compressionType=nonelog4j.appender.kafka.syncSend=falselog4j.appender.kafka.layout=org.apache.log4j.PatternLayout#log4j.appender.kafka.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%nlog4j.appender.kafka.layout.ConversionPattern=[%d] %p %m (%c)%n# appender consolelog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayout#log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%t] - [%l] %m%nlog4j.appender.console.layout.ConversionPattern=[%d] [%p] [%t] %m%nlog4j.logger.org.eclipse.jetty=WARNlog4j.logger.org.eclipse.jetty.util.component.AbstractLifeCycle=ERRORlog4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFOlog4j.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>非常簡(jiǎn)單,一個(gè)maven依賴加一個(gè)log4j配置文件即可,如果依然想寫入log到本地 文件依然也是可以的,這種方式最簡(jiǎn)單快速,但是默認(rèn)的的log日志是一行一行的純文本,有些場(chǎng)景下我們可能需要json格式的數(shù)據(jù)。
方法二:
重寫Log4jAppender,自定義輸出格式,支持json格式,如果是json格式的數(shù)據(jù)打入到kafka中,后續(xù)收集程序可能就非常方便了,直接拿到j(luò)son就能入到mongodb或者es中,如果打入到kafka中的數(shù)據(jù)是純文本,那么收集程序,可能需要做一些etl,解析其中的一些字段然后再入到es中,所以原生的輸出格式,可能稍不靈活,這樣就需要我們自己寫一些類,然后達(dá)到靈活的程度,github連接:
https://github.com/qindongliang/log_to_kafka
感興趣的朋友可以看下。
總結(jié):
(1)方法一簡(jiǎn)單快速,不支持json格式的輸出,打到kafka的消息都是原樣的log日志信息
(2)方法二稍微復(fù)雜,需要自己擴(kuò)展log收集類,但支持json格式的數(shù)據(jù)輸出,對(duì)于想落地json數(shù)據(jù)直接到存儲(chǔ)系統(tǒng)中是非常適合的。
此外需要注意,在調(diào)試的時(shí)候log發(fā)送數(shù)據(jù)到kafka模式最好是同步模式的否則你控制臺(tái)打印的數(shù)據(jù)很有可能不會(huì)被收集kafka中,程序就停止了。生產(chǎn)環(huán)境最好開啟異步發(fā)送數(shù)據(jù)模式,因?yàn)閮?nèi)部是批量的處理,所以能提升吞吐,但有一定的輕微延遲。
官網(wǎng)log4j-appender的源碼:
https://github.com/apache/kafka/tree/trunk/log4j-appender/src/test/java/org/apache/kafka/log4jappender
有什么問(wèn)題可以掃碼關(guān)注微信公眾號(hào):我是攻城師(woshigcs),在后臺(tái)留言咨詢。 技術(shù)債不能欠,健康債更不能欠, 求道之路,與君同行。

新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注