flume1.7.0-taildirSource 支持多文件监控和断点续传

来源:互联网 发布:中国制造2025 知乎 编辑:程序博客网 时间:2024/05/21 22:20

flume 1.7.0 推出了 taildirSource 组件。tail 监控 目录下匹配上正则表达式的 的所有文件,实现断点续传。


问题

但是官方的 taildirSource 组件貌似是支持nginx 日志,对于log4j 日志好像不太管用。
因为log4j 日志会自动切分,log4j 切分日志其实就是新建一个文件,然后把原来的日志文件都改名。但是 taildirSource 组件时不支持文件改名的。如果文件改名会认为是新文件,就会重新读取,这就导致了日志文件重读。


解决

为了解决这个问题,我去读了 taildirSource 的源码。

发现了两个地方 需要修改

1.修改 ReliableTaildirEventReader

修改ReliableTaildirEventReader 类的 updateTailFiles 方法。

将其中的 tf.getPath().equals(f.getAbsolutePath()) 判断条件去除。
只用判断文件不为空即可,不用判断文件的名字,因为log4j 日志切分文件被重命名了。

//        if (tf == null || !tf.getPath().equals(f.getAbsolutePath())) {                if (tf == null) {//文件不存在 position 中则全读。

2.修改TailFile

修改TailFile 类的 updatePos 方法

此处同样的原因,inode 已经能够确定唯一的 文件了,所以不用加 path 作为判定条件了。所以去掉该条件就支持了文件重命名情况。

   //     if (this.inode == inode && this.path.equals(path))           if (this.inode == inode) 

修改这两个地方就支持了文件重命名 的问题,实现了目录下多文件监控,断点续传。


添加自定义source入口,也就是将源码拷贝过来,然后将修改过的代码打包为自定义source的jar 包运行flume 。

参考 : flume自定义组件的 jar 包管理


3.配置文件

提供 taildirsource 的配置文件如下

a1.sources = r1a1.sources.r1.type = com.xx.xx.source.taildir.TaildirSourcea1.sources.r1.channels = c1a1.sources.r1.positionFile = /opt/apps/log4j/taildir_position.jsona1.sources.r1.filegroups = f1a1.sources.r1.filegroups.f1 = /opt/apps/log4j/logs/*.log.*a1.sources.r1.fileHeader = true

通过这些修改就 实现了多文件监控和断点续传。支持log4j 日志监控。

参考: http://blog.csdn.net/test103/article/details/55096786#reply

0 0