Flume TaildirSource 实现递归

下载源码

       flume-ng-1.6.0-cdh5.7.0-src.tar.gz

修改源码

       打开 org.apache.flume.source.taildir.ReliableTaildirEventReader类

       找到 getMatchFiles 方法

private List getMatchFiles(File parentDir, final Pattern fileNamePattern) {
    FileFilter filter = new FileFilter() {
      public boolean accept(File f) {
        String fileName = f.getName();
        if (f.isDirectory() || !fileNamePattern.matcher(fileName).matches()) {
          return false;
        }
        return true;
      }
    };
    File[] files = parentDir.listFiles(filter);
    Collections.sort(result, new TailFile.CompareByLastModifiedTime());

    return result;
  }

  上面这段flume源代码的作用是:

         1、获取监听目录下所有符合正则匹配规则的文件,放入集合中并返回
         2、taildir source 就是判断去这个方法返回的所有文件,查看文件中是否是新增或被修改过,然后读取根据偏移量读取文件内容的

 

因此taildir支持递归的关键在与获取监听文件夹下的所有子文件,包括其子文件夹下的文件

修改后的代码(包含两个新增方法)

/**
   * 修改flume源码,使其支持递归
   * @param parentDir
   * @param fileNamePattern
   * @return
   */
  private List getMatchFiles(File parentDir, final Pattern fileNamePattern) {
    //所有指定文件夹下的所有文件,在通过正则匹配规则过滤不符合条件的文件
    List result = Lists.newArrayList();
    for(File f: getAllFiles(parentDir)){
      String fileName = f.getName();
        if (fileNamePattern.matcher(fileName).matches()) {
          result.add(f);
        }
    }
    Collections.sort(result, new TailFile.CompareByLastModifiedTime());

    return result;
  }

  /**
   * 新增方法
   * 获取指定目录下的所有文件,通过递归的方式
   * @param parentDir
   * @return
   */
  private List getAllFiles(File parentDir){
    List fileList = Lists.newArrayList();
    getAllFiles(parentDir,fileList);
    return fileList;
  }

  /**
   * 新增方法
   */
  private void getAllFiles(File parentDir,List fileList){
    File[] files = parentDir.listFiles();
    if(null != files){
      for(File file: parentDir.listFiles()){
        if(file.isDirectory()){
          getAllFiles(file,fileList);
        }else{
          fileList.add(file);
        }
      }
    }
  }

编译

cd flume-ng-1.6.0-cdh5.7.0-src/flume-ng-1.6.0-cdh5.7.0/flume-ng-sources/flume-taildir-source
mvn clean package
#构建成功后将 target下的 flume-taildir-source-1.6.0-cdh5.7.0.jar 拷贝到flume应用程序的lib下

测试

     编辑flume配置文件

a1.sources=r1
a1.sinks=k1
a1.channels=c1

a1.sources.r1.type=TAILDIR
a1.sources.r1.filegroups=f1
a1.sources.r1.filegroups.f1=/tmp/flume/.*.log
a1.sources.r1.positionFile=/tmp/flume/position/taildir_position.json
a1.sources.r1.headers.f1.headerKey1=value1

a1.sinks.k1.type=logger

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

a1.sources.r1.channels=c1
a1.sinks.k1.channel=c1
bin/flume-ng agent --conf conf --conf-file conf/taildir-channels-logger.conf --name a1 -Dflume.root.logger=INFO,console

#新建窗口
mkdir -p /tmp/flume/f/f1/f2
echo "666" >> /tmp/flume/f/f1/f2/test.log


#控制台打印日志
2019-06-20 21:12:23,352 (SinkRunner-PollingRunner-DefaultSinkProcessor) [INFO -org.apache.flume.sink.LoggerSink.process(LoggerSink.java:94)] Event: { headers:{headerKey1=value1} body: 36 36 36                                        666 }

扩展

    apace-flume-1.8.0版本中这部分源码已经被改了,所以这里不适用。不过原理都是一样的。后续有空在修改。

你可能感兴趣的:(flume,Java)