flume-ng 实际应用例子,flume采集log4j日志


上一篇文章中已经简单介绍过flume点击打开链接,这里就为大家共享一下flume的实际应用:

简单测试项目:

1、新建java项目结构如下:

flume-ng 实际应用例子,flume采集log4j日志_第1张图片


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日志_第2张图片

查看hdfs目录:

flume-ng 实际应用例子,flume采集log4j日志_第3张图片

采集成功!




简单说明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文件来接收。


你可能感兴趣的:(flume)