最近遇到一个问题,就是我们在exec的命令行中输入 “tail -f /export/home/tomcat/logs/*/*.log” ,没有任何数据录入,为了解决这个问题,我们自己开发了一个flume数据接收端,主要实现的功能是通过检测一个问价夹下所有文件,通过多线程将每个文件通过tail 命令读取到channel中。
1,实现思路
2,flume规则
自定义flume source结构
public class SourceName extends AbstractSource implements EventDrivenSource,
Configurable {
// 获取配置
@Override
public void configure(Context context) {
}
//开始收集数据
@Override
public synchronized void start() {
}
//结束收集数据
@Override
public synchronized void stop() {
}
}
或者
public class SourceName extends AbstractSource implements Configurable,
PollableSource {
// 获取配置
@Override
public void configure(Context context)throws EventDeliveryException {
return null;
}
//开始收集数据
@Override
public synchronized void start() {
}
//结束收集数据
@Override
public synchronized void stop() {
}
}
自定义fluem sink结构
public class SinkName extends AbstractSink implements Configurable {
private static final Logger log = LoggerFactory.getLogger(AbstractSink.class);
Context c;
@Override
public void configure(Context arg0) {
this.c = arg0;
}
//循环调用输出数据
@Override
public Status process() throws EventDeliveryException {
return Status.READY;
}
//输出流开始(调用一次)
@Override
public synchronized void start() {
super.start();
}
//输出流结束(调用一次)
@Override
public synchronized void stop() {
super.stop();
}
}
3,实现
/*
* 作者:许恕
* 时间:2016年5月3日
* 功能:实现tail 某目录下的所有符合正则条件的文件
* Email:xvshu1@163.com
* To detect all files in a folder
*/
package org.apache.flume.source;
import com.google.common.base.Preconditions;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.apache.flume.Context;
import org.apache.flume.Event;
import org.apache.flume.EventDrivenSource;
import org.apache.flume.SystemClock;
import org.apache.flume.channel.ChannelProcessor;
import org.apache.flume.conf.Configurable;
import org.apache.flume.event.EventBuilder;
import org.apache.flume.instrumentation.SourceCounter;
import org.apache.flume.tools.HostUtils;
import org.mortbay.util.ajax.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.Matcher;
im