storm实时去读实时日志

 

实时读取日志文件信息,在24点时日志文件名会被重命名导致,若此时读取文件则发送读写冲突,所以采用暂停读取,文件被重命名后再读取

日志文件读取方式:采用行读取,内读取一行就调整一下读取文件大小值;防止出现读取半行数据

package com.mysoft.storm.spout;

import java.io.File;
import java.io.RandomAccessFile;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import org.apache.log4j.Logger;

import backtype.storm.spout.SpoutOutputCollector;
import backtype.storm.task.TopologyContext;
import backtype.storm.topology.OutputFieldsDeclarer;
import backtype.storm.topology.base.BaseRichSpout;
import backtype.storm.tuple.Fields;
import backtype.storm.tuple.Values;


/**  
* @Title: LogReader.java
* @Package cn.itcast.storm.spout
* @Description: TODO(读取日志)
* @author wwl
* @date 2016年7月18日 下午6:05:58
* @version V1.0  
*/
public class LogReader extends BaseRichSpout {
	private static final Logger logger = Logger.getLogger("order");

	private static final long serialVersionUID = 2197521792014017918L;
	
	private SpoutOutputCollector collector;
	private long lastTimeFileSize = 0;
	private String fileName;
	private File file;
	private SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
	private Date startDate;

	@Override
	@SuppressWarnings({ "rawtypes", "deprecation" })
	public void open(Map conf, TopologyContext context, SpoutOutputCollector collector) {
		this.collector = collector;
		fileName = (String) conf.get("FILENAME");
		file = new File(fileName);
		Date now=new Date();
		try {
			String startTime="20160101000000";
			startDate=format.parse(startTime);
			startDate.setDate(now.getDate()+1);
			startDate.setMonth(now.getMonth());
			startDate.setYear(now.getYear());
			logger.info("日志日切时间:"+format.format(startDate));
		} catch (ParseException e) {
			logger.error("时间格式转化错误,录入数据格式错误");
			e.printStackTrace();
		}
	}

	@SuppressWarnings("deprecation")
	@Override
	public void nextTuple() {
		Date now=new Date();
		if(startDate.getTime()-now.getTime()>0&&startDate.getTime()-now.getTime()<180000){
			try {
				SimpleDateFormat sf = new SimpleDateFormat(".yyyyMMdd");
				String tags=sf.format(now);
				Thread.sleep(180000);
				workPreFile(tags);
				startDate.setDate(startDate.getDate()+1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}  
		}else{
			work();
		}
	}
	
	/**
	 * 读取当天日志
	 */
	public void work() {

		RandomAccessFile randomFile = null;
		logger.info("size " + lastTimeFileSize);
		try {
			randomFile = new RandomAccessFile(file, "r");
			randomFile.seek(lastTimeFileSize);
			String line = null;
			StringBuffer sb=new StringBuffer();
			while ((line = randomFile.readLine()) != null) {
				if(line.contains("END")){//航结束标识,排除读取前半行数据情况
					collector.emit(new Values(line));
					sb.append(line);
					lastTimeFileSize=lastTimeFileSize+line.getBytes().length;
					logger.info("readline " + line+"  "+lastTimeFileSize);
				}
			}
			randomFile.close();
		} catch (Exception e) {
			logger.error("work()", e);
			e.printStackTrace();
		}

	}
	
	/**
	 * 读取前一天的日志文件
	 */
	public void workPreFile(String tags) {
		logger.info("workPreFile(String) - start");

		RandomAccessFile randomFile = null;
		try {
			File preFile=new File(fileName+tags);
			randomFile = new RandomAccessFile(preFile, "r");
			randomFile.seek(lastTimeFileSize);
			String line = null;
			while ((line = randomFile.readLine()) != null) {
				collector.emit(new Values(line));
				logger.info("readline " + line);
			}
			randomFile.close();
			lastTimeFileSize=0;
		} catch (Exception e) {
			logger.error("workPreFile(String)", e);
			e.printStackTrace();
		}

		logger.info("workPreFile(String) - end");
	}
	
	@Override
	public void declareOutputFields(OutputFieldsDeclarer declarer) {
		declarer.declare(new Fields("line"));
	}

}

 

posted @ 2016-08-01 16:41  W&L  阅读(701)  评论(0)    收藏  举报