Flume实时采集日志到Kafka(极简版)

背景:
由于项目采用微服务架构,业务日志文件数量较多,我做了个简单的日志监控服务,先在此分享下日志采集的简单步骤,没有任何花里胡哨 ~(ps:一切数据到了 kafka就非常好解决了!)

一、Flume安装

Flume的安装使用可以说非常简单,直接进官网:http://flume.apache.org/

Flume实时采集日志到Kafka(极简版)_第1张图片
最新是1.9.0版本,我们选择1.8.0版本下载。
Flume实时采集日志到Kafka(极简版)_第2张图片
Flume实时采集日志到Kafka(极简版)_第3张图片
然后在Linux下解压:
在这里插入图片描述
Flume实时采集日志到Kafka(极简版)_第4张图片
配置用户环境变量:(如果有root权限可以配置在/etc/profile

vim ~/.bashrc

在末尾添加路径:

FLUME_HOME=/home/dev/flume/flume-1.8.0
PATH=$PATH:$FLUME_HOME/bin

source使其生效:

source ~/.bashrc

二、确定日志采集策略

需要根据我们的日志类型来确定最佳策略。

我们项目的业务日志是通过Logback生成,日志形式如下所示:
Flume实时采集日志到Kafka(极简版)_第5张图片
根据日期规则进行滚动:
当天的日志文件名为stdout.log,过了凌晨12点即把stdout.log改名为stdout.log.昨天日期.log,然后日志重新输出在新的stdout.log。所以我们只需要采集名为stdout.log的文件即可。

一般Flume采集日志source有两种方式:

1.Exec类型的Source
可以将命令产生的输出作为源,如:

a1.sources.r1.type = exec
a1.sources.r1.command = ping 10.3.1.227 //此处输入命令

2.Spooling Directory类型的 Source
将指定的文件加入到“自动搜集 ”目录中。flume会持续监听这个目录,把文件当做source来处理。注意:一旦文件被放到“自动收集”目录中后,便不能修改,如果修改,flume会报错。此外,也不能有重名的文件,如果有,flume也会报错。

a1.sources.r1.type = spooldir
a1.sources.r1.spoolDir = /home/work/data

向指定的文件目录下传送一个日志文件,发现flume的控制台打印相关的信息;此外,会发现被处理的文件,会追加一个后缀:completed,表示已处理完。

确定采集姿势:

如果采用spooldir的方式来监控log文件夹,flume会采集log数据,但是滚动生成stdout.log.昨天日期.log,flume就会把stdout.log.昨天日期.log文件当作新文件,又重新读取一遍,导致重复

所以使用exec命令行的方式,通过tail -F *.log命令比较好!

注意: -F根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪。 而-f根据文件的nodeid即文件描述符进行追踪,当文件改名或被删除,追踪停止 。

三、添加Flume-Sink:Kafka的配置

网上关于这种配置文件五花八门,都是对应Flume不同版本的产物,无法判断对错,所以我建议大家直接去官网查看对应版本Flume的配置写法!

Flume实时采集日志到Kafka(极简版)_第6张图片
查看文档根据自己的版本来!此处我的是1.8.0!
Flume实时采集日志到Kafka(极简版)_第7张图片
Flume实时采集日志到Kafka(极简版)_第8张图片
Flume实时采集日志到Kafka(极简版)_第9张图片
附上我的配置(在flume的conf目录下添加kafka-producer.conf):
Flume实时采集日志到Kafka(极简版)_第10张图片
文字版如下:

pro.sources = s1
pro.channels = c1
pro.sinks = k1

pro.sources.s1.type = exec
pro.sources.s1.command = tail -F /home/dev/log/moercredit/stdout.log

pro.channels.c1.type = memory
pro.channels.c1.capacity = 1000
pro.channels.c1.transactionCapacity = 100

pro.sinks.k1.type = org.apache.flume.sink.kafka.KafkaSink
pro.sinks.k1.kafka.topic = moercredit_log_test
pro.sinks.k1.kafka.bootstrap.servers = cdh1:9092,cdh2:9092,cdh3:9092
pro.sinks.k1.kafka.flumeBatchSize = 20
pro.sinks.k1.kafka.producer.acks = 1
pro.sinks.k1.kafka.producer.linger.ms = 1
pro.sinks.k1.kafka.producer.compression.type = snappy

pro.sources.s1.channels = c1
pro.sinks.k1.channel = c1

注:上面的 cdh1、2、3为主机名,此处配置 IP:端口也行

四、启动并测试

在conf目录下执行命令:

nohup flume-ng agent -n pro -c ./ -f kafka-producer.conf & 

注:
-n : agent的name
-c:conf目录路径
-f:配置文件路径

上面命令会将日志打印在目录下的nohup.out文件里,如果不需要,可以执行如下命令:

nohup flume-ng agent -n pro -c ./ -f kafka-producer.conf >/dev/null 2>&1 & 

扩展:
Linux下还有一个特殊的文件/dev/null,或称空设备,是一个特殊的设备文件;它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如: # ls 1>/dev/null
2>/dev/null 还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如: # ls/dev/null 2>&1
注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到
/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,于是一切静悄悄:-)
由于使用nohup时,会自动将输出写入nohup.out文件中,如果文件很大的话,nohup.out就会不停的增大,这是我们不希望看到的,因此,可以利用/dev/null来解决这个问题。
nohup ./program >/dev/null 2>log &
如果错误信息也不想要的话: nohup ./program /dev/null 2>&1 &

启动后我们通过Kafka Tool工具查看日志topic里面有没有数据:
Flume实时采集日志到Kafka(极简版)_第11张图片
一切 OK!

你可能感兴趣的:(大数据)