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")); } }