Flume滚动文件输出时文件名格式化为yyyyMMddHHmmss

前言

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 追溯源码

  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很快的找到。
目前还没有编译成功在本地运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值