1、如何讓log4j直接輸出日誌到flume?
2、如何寫一個簡單的測試類來測試呢?
3、如何看到log4j的日誌是否輸出到了flume中?
log4j.properties配置:
-
log4j.rootLogger=INFO
-
log4j.category.com.besttone=INFO,flume
-
log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
-
log4j.appender.flume.Hostname = localhost
-
log4j.appender.flume.Port = 44444
- log4j.appender.flume.UnsafeMode = true
需要將/opt/cloudera/parcels/CDH-5.0.0-1.cdh5.0.0.p0.47/lib/flume-ng/tools/flume-ng-log4jappender-1.4.0-cdh5.0.0-jar-with-dependencies.jar添加到classpath下。
然後可以寫一個簡單的測試類來測試一下:
-
package com.besttone.flume;
-
-
import java.util.Date;
-
-
import org.apache.commons.logging.Log;
-
import org.apache.commons.logging.LogFactory;
-
-
public class WriteLog {
-
protected static final Log logger = LogFactory.getLog(WriteLog.class);
-
-
/**
-
* @param args
-
* @throws InterruptedException
-
*/
-
public static void main(String[] args) throws InterruptedException {
-
// TODO Auto-generated method stub
-
while (true) {
-
//每隔兩秒log輸出一下當前系統時間戳
-
logger.info(new Date().getTime());
-
Thread.sleep(2000);
-
}
-
}
- }
然後寫一個run.sh腳本運行這個類:
-
#!/bin/bash
-
jarlist=`ls ./lib/*.jar`
-
CLASSPATH='./bin/'
-
for jar in ${jarlist}
-
do
-
CLASSPATH=${CLASSPATH}:${jar}
-
done
-
echo ${CLASSPATH}
-
- java -classpath "$CLASSPATH" com.besttone.flume.WriteLog &
執行run.sh,將sink設置爲logger,去flume的日誌文件裏去看,可以看到log4j的日誌輸出已經傳輸到了flume中:
- 2014-07-16 14:23:54,193 INFO org.apache.flume.sink.LoggerSink: Event: { headers:{flume.client.log4j.log.level=20000, flume.client.log4j.message.encoding=UTF8, flume.client.log4j.logger.name=com.besttone.flume.WriteLog, flume.client.log4j.timestamp=1405491834189} body: 31 34 30 35 34 39 31 38 33 34 31 38 39 1405491834189 }