通常我们使用exec类型的source,通过执行 tail命令来监控采集日志的,但是如果agent进程突然挂了,下次重启采集任务,会导致日志文件内容重复采集。这里可以采用Taildir Source来防止重复消费问题。
基本配置
监听目标文件,当数据被添加到文件后能实时地tail它们。如果正在写入新行,则此source将重试读取它们以等待写入完成。此source是可靠的,即使tail的文件轮替也不会丢失数据。它定期以JSON格式写入给定位置文件上每个文件的最后读取位置。如果Flume由于某种原因stop或down,它可以从文件position处重新开始tail。在其他用法中,此source也可以通过给定的position文件从每个文件的任意位置开始tail。当指定路径上没有position文件时,默认情况下它将从每个文件的第一行开始tail。文件将按修改时间顺序使用。将首先使用具有最早修改时间的文件。此source不会重命名或删除或对正在tail的文件执行任何修改。目前此source不支持tail二进制文件,它只能逐行读取文本文件。其功能的重点就在于有一个记录采集文件position记录,每次重新采集都可以从该记录中获取上一次的position,接着上次往后采集,因此能够解决断点续传的问题,以避免重复消费问题。
在Flume的conf目录下创建配置文件:kafka-producer-moercredit.conf:
pro.sources = s1
pro.channels = c1
pro.sinks = k1
pro.sources.s1.type = TAILDIR
pro.sources.s1.positionFile = /home/dev/flume/flume-1.8.0/log/taildir_position.json
pro.sources.s1.filegroups = f1//是一组文件,可以以空格分隔,也支持正则表达式
pro.sources.s1.filegroups.f1 = /home/dev/log/moercredit/logstash.log
pro.sources.s1.headers.f1.headerKey1 = aaa
pro.sources.s1.fileHeader = true
pro.sources.s1.channels = c1
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

本文介绍了如何使用Flume的Taildir Source防止重复消费日志。Taildir Source能够可靠地跟踪文件的读取位置,即使文件轮替也不会丢失数据。当Flume进程重启时,它会从position文件中恢复上一次的读取位置,从而实现断点续传。文中还探讨了Taildir Source根据文件名而非inode进行采集,以及在进程重启后如何处理的情况。
最低0.47元/天 解锁文章
266

被折叠的 条评论
为什么被折叠?



