天天看點

flume-ng 實際應用例子,flume采集log4j日志

flume-ng 實際應用例子,flume采集log4j日志

上一篇文章中已經簡單介紹過flume點選打開連結,這裡就為大家共享一下flume的實際應用:

簡單測試項目:

1、建立java項目結構如下:

flume-ng 實際應用例子,flume采集log4j日志

WriteLog代碼如下:

import java.util.Date;
import org.apache.log4j.Logger;
public class WriteLog {
	private static Logger logger = Logger.getLogger(WriteLog.class);  
	public static void main(String[] args) throws InterruptedException {
	// 記錄debug級别的資訊  
        logger.debug("This is debug message.");  
        // 記錄info級别的資訊  
        logger.info("This is info message.");  
        // 記錄error級别的資訊  
        logger.error("This is error message.");  
		while (true) {
			logger.info(new Date().getTime());
			logger.info("測試資料");
			Thread.sleep(2000);
		}
	}
}      

log4j 配置如下:

其中hostname 是我flume安裝的伺服器IP

port是端口 跟下面的flume的監聽端口相對應

log4j.rootLogger = debug,stdout
log4j.appender.flume = org.apache.flume.clients.log4jappender.Log4jAppender
log4j.appender.flume.Hostname = 192.168.0.166
log4j.appender.flume.Port = 4141
log4j.appender.flume.UnsafeMode = true
# configure a class's logger to output to the flume appender
log4j.logger.WriteLog = DEBUG,flume
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

      

2、配置flume

flume/conf下:

建立avro.conf 檔案 内容如下:

當然 skin 可以用任何方式,這裡我用的是hdfs,吧日志存放到hdfs目錄,具體的skin方式可以看官網;

a1.sources=source1
a1.channels=channel1
a1.sinks=sink1

a1.sources.source1.type=avro
a1.sources.source1.bind=0.0.0.0
a1.sources.source1.port=4141

a1.channels.channel1.type=memory
a1.channels.channel1.capacity=10000
a1.channels.channel1.transactionCapacity=1000
a1.channels.channel1.keep-alive=30

a1.sinks.sink1.type = hdfs
a1.sinks.sink1.hdfs.path = hdfs://lin166:8020/flume/avro/%y-%m-%d
a1.sinks.sink1.hdfs.filePrefix = log-%H%M
a1.sinks.sink1.hdfs.useLocalTimeStamp = true
a1.sinks.sink1.hdfs.fileType = DataStream
a1.sinks.sink1.hdfs.writeFormat = Text
a1.sinks.sink1.hdfs.round = true 
a1.sinks.sink1.hdfs.roundValue = 10
a1.sinks.sink1.hdfs.roundUnit = minute
a1.sinks.sink1.hdfs.rollInterval = 0
a1.sinks.sink1.hdfs.rollSize	= 10240
a1.sinks.sink1.hdfs.rollCount = 0
a1.sinks.sink1.hdfs.idleTimeout = 0


a1.sources.source1.channels = channel1
a1.sinks.sink1.channel = channel1

      

3、啟動:bin/flume-ng agent --conf conf --conf-file conf/avro.conf --name a1 -Dflume.root.logger=INFO,console

     測試:  運作main函數 

可以看到 flume 控制台輸出:

flume-ng 實際應用例子,flume采集log4j日志

檢視hdfs目錄:

flume-ng 實際應用例子,flume采集log4j日志

采內建功!

簡單說明skin為hdfs時候的參數, 預設是輸出到HDFS後為sequencefile,裡面的内容并不是我們想看到的,為了便于直覺看到我們輸出的日志資訊,是以需要把fileType設定為DataStream, writeFormat=Text,這樣就可以直接打開生成的檔案進行檢視了。

roll開頭的參數都是用來控制滾動日志輸出的,官方文檔上的說明也很詳細,我這裡配置的隻按檔案大小來滾動rollSize=10240,也就是10K滾動生成一個新的檔案用來接收新的EVENTS。實際中這個Size根據自己的需要來定;

idleTimeout設定為60秒(預設值為0),這裡面的原理是這樣的,flume裡面每生成一個接收檔案時的命名規則如:FlumeData.xxxxxxx.tmp,.tmp表示這個檔案正在被使用來接收EVENTS,當滿10K之後,這個檔案會被rename成FlumeData.xxxxxxx,把.tmp字尾去掉,但是如果你停止了應用程式後,FlumeData.xxxxxxx.tmp還沒滿10K,按照預設的idleTimeout設定,不會将它rename,也就是.tmp字尾一直在,造成了這個檔案一直在使用當中的一個假象,這是有問題的,我們設定idleTimeout=60,即60秒後這個檔案還沒有被寫入資料,就會關閉它然後rename它去掉.tmp,以後新進來的events,會新開一個.tmp檔案來接收。