1. 下载flume源码, 并将Taildir Source
相关源码复制到自己的项目中。
本例使用的源码为 flume-ng-1.6.0-cdh5.16.1
相关代码文件有:
- ReliableTaildirEventReader.java
- TaildirMatcher
- TaildirSource
- TaildirSourceConfiguration
- TaildirSourceConfigurationContants
2. 修改TaildirMatcher.java
相关代码
- 添加递归获取文件的函数
private List<File> getMatchingFilesNoCacheRecursion(){
List<File> result = findFiles(new File(filePattern));
return result;
}
private List<File> findFiles(File dir){
List<File> result = Lists.newArrayList();
if(dir.isFile()){
result.add(dir);
return result;
}else{
File[] subNames = dir.listFiles();
for (File f: subNames){
if(f.isFile()){
result.add(f);
}else{
result.addAll( findFiles(f));
}
}
return result;
}
}
- 注册该函数
修改getMatchingFiles
函数,将
lastMatchedFiles = sortByLastModifiedTime(getMatchingFilesNoCache());
修改为
lastMatchedFiles = sortByLastModifiedTime(getMatchingFilesNoCacheRecursion());
- 移除检测是否存在父目录的异常检测
删除TaildirMatcher
类构造函数中的以下代码
// sanity check 删除以下两行
// Preconditions.checkState(parentDir.exists(),
// "Directory does not exist: " + parentDir.getAbsolutePath());
3. 打包并上传至相关文件夹
4. 方法的不足
- 不支持正则表达式匹配
- 可能有没有处理的异常