前言
Flume的sink 本地文件存储使用File Roll Sink时,默认文件格式是启动当前的时间戳+数字,不方便观察。于是查看源码,发现一个新大陆。Flime的RollingFileSink有PathManager(路径管理器)中找到了答案。
一、如何配置?
直接上结果:在配置文件中加入这个参数
# 这是路径按照时间格式yyyyMMddHHmmss 滚动文件
sink.pathManager = ROLLTIME
# 完整版
a1.sinks.k1.type = file_roll
a1.sinks.k1.sink.pathManager = ROLLTIME
二、源码分析
2.1 追溯源码
- 查看官网的说明
File Roll Sink
Stores events on the local filesystem. Required properties are in bold.
Property Name Default Description
channel –
type – The component type name, needs to be file_roll.
sink.directory – The directory where files will be stored
sink.pathManager DEFAULT The PathManager implementation to use.
sink.pathManager.extension – The file extension if the default PathManager is used.
sink.pathManager.prefix – A character string to add to the beginning of the file name if the default PathManager is used
sink.rollInterval 30 Roll the file every 30 seconds. Specifying 0 will disable rolling and cause all events to be written to a single file.
sink.serializer TEXT Other possible options include avro_event or the FQCN of an implementation of EventSerializer.Builder interface.
sink.batchSize 100
Example for agent named a1:
a1.channels = c1
a1.sinks = k1
a1.sinks.k1.type = file_roll
a1.sinks.k1.channel = c1
a1.sinks.k1.sink.directory = /var/log/flume
重点从file_roll关键字入手,使用IDEA的搜索很容易找到,前提是引入flume-ng-core依赖包。
正式进入核心类 RollingFileSink
它是有configure、start、process、stop四部分组成,简单说一下他们的流程
1 configure 逐步配置了路径管理pathManager,文件夹directory,滚动间隔rollInterval,serializer序列化器、批量尺寸batchSize等等
2 start 计数器设置成0,设置时间等;设置文件夹BaseDirectory,启动一个java单线程的定时器,就是更改shouldRotate变量,就是让process方法中执行刷新文件,新建文件等等;
3 process 主要分为三个大部分。
3.1 定时器的时间到了,写出文件。
3.2 outputStream 是空时,上一步更改的。按照规则新建一个文件
3.3 处理每条日志的逻辑
2.2 路径管理器是关键
源码中有三个路径管理器并且封装在PathManagerType中:DEFAULT、ROLLTIME、OTHER。DEFAULT就是默认设置的,根据时间戳生成。ROLLTIME 按照yyyyMMddHHmmss格式生成文件名并且有个数,需要把batchSize设置大一些减少生成文件的个数。OTHER 是自定义需要实现PathManager接口并且实现PathManager$Builder构造方法。
怎么实现的新建文件呢?
当时刻到了,pathController.rotate() 在获取当前文件。接着向后看源码:
就是把当前文件设置null,然后在根据当前时间获取一个文件名,替换成当前的输出文件。
2.3 自定义文件路径
按照整点触发,不按照启动时间触发。解决文件中存在跨天数据问题。
自动创建目录,和指定文件夹为时间格式。
待续…
三 总结
如果没有什么必要请使用官网提高的组件,因为有人维护,从网上抄的很容易出席Bug。Flume比较容易理解的,借助Idea很快的找到。
目前还没有编译成功在本地运行。