1. 程式人生 > >從日誌中心獲取資料並進行處理和預警

從日誌中心獲取資料並進行處理和預警

package com.ccservice.train.app.Reptile_mobile_warning.task;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ccservice.Util.PropertyUtil;
import com.ccservice.Util.file.WriteLog;
import com.ccservice.Util.string.StringUtil;
import com.ccservice.train.buy_web_train.util.MsgDingDingUtil;

/**
 * 查詢排隊的代理IP
 * 
 * @author Administrator
 *
 */
public class CheckProxyIPOfFellIn {
	public static Map<String, Integer> ipCountMap = new HashMap<String, Integer>();// 每個代理ip的計數
	public static String collectedIPs = "";
	public static String collectedIDs = "";
	public static String earlyWarningIp = "";// 預警ip
	private static long cacheTime = Long.parseLong(PropertyUtil.getValue("cacheTime", "warning.properties").toString());//執行搜尋日誌任務的間隔時間
	private static long warnCacheTime = Long.parseLong(PropertyUtil.getValue("warnCacheTime", "warning.properties").toString());//執行報警任務的間隔時間
	private static Integer delay = Integer.parseInt((PropertyUtil.getValue("delay", "warning.properties").toString()));//開始執行任務延遲時間
	/**
	 * 重複執行收集日誌的任務
	 */
	public static void repeatTask(){
		Timer timer = new Timer();
    	TimerTask task = new TimerTask() {
			@Override
			public void run() {
				generateEarlyWarningIP();
			}
		};
		timer.schedule(task, delay,cacheTime);
	}
	
	public static void setValueOfIpCountMap() {
		Date date=new Date();
		Calendar calendar = Calendar.getInstance();
		String toDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
		calendar.setTime(date);
		calendar.set(Calendar.HOUR,
				calendar.get(Calendar.HOUR) - 1);
		String fromDate=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime());
		getIP();
		String[] ipArr = collectedIPs.split(",");
		for (int i = 0; i < ipArr.length; i++) {
			String ip = ipArr[i];
			if (!ipCountMap.containsKey(ip)) {
				ipCountMap.put(ip, 1);
			} else {
				// 否則獲得c的值並且加1
				ipCountMap.put(ip, ipCountMap.get(ip) + 1);
			}
		}
	}
	/**
	 * 生成報警ip
	 */
	public static void generateEarlyWarningIP() {
		setValueOfIpCountMap();
		for (java.util.Map.Entry<String, Integer> entry : ipCountMap.entrySet()) {
			String key = entry.getKey();
			int value = entry.getValue();
			if (!StringUtil.StringIsNull(value+"")&&value >= 3 && earlyWarningIp.indexOf(key) < 0) {
				earlyWarningIp = earlyWarningIp + key+";";
			}
		}
	}
	/**
	 * 釘釘報警
	 */
	public static void warning(){
		String url_dingding = PropertyUtil.getValue("zhenji_monitoring_url_dingding", "system.properties");
		if(!"".equals(earlyWarningIp)){
			MsgDingDingUtil.sendDingdingMsg_back("排隊的代理IP為:"+earlyWarningIp, url_dingding);
		}
		//每天凌晨過後清空當天快取資料
        if(isBelong()){
        ipCountMap = new HashMap<String, Integer>();// 每個代理ip的計數
    	earlyWarningIp = "";// 預警ip
    	collectedIDs="";
    	collectedIPs="";
        }
	}
	/**
	 * 重複執行報警任務
	 */
	public static void bjTask(){
		Calendar calendar = Calendar.getInstance();
		calendar.set(Calendar.HOUR_OF_DAY, 1); //凌晨1點
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		Date date=calendar.getTime(); //第一次執行定時任務的時間
		//如果第一次執行定時任務的時間 小於當前的時間
		//此時要在 第一次執行定時任務的時間加一天,以便此任務在下個時間點執行。如果不加一天,任務會立即執行。
		if (date.before(new Date())) {
			date = addDay(date, 1);
		}
		Timer timer = new Timer();
    	TimerTask task = new TimerTask() {
			@Override
			public void run() {
				generateEarlyWarningIP();
				warning();
			}
		};
		//repeatTask();
		timer.schedule(task, 1000,warnCacheTime);
	}
	public static Date addDay(Date date, int num) {
		Calendar startDT = Calendar.getInstance();
		startDT.setTime(date);
		startDT.add(Calendar.DAY_OF_MONTH, num);
		return startDT.getTime();
	}
	public static void getIP(){
		collectedIPs="";
		String dateStr=new SimpleDateFormat("yyyy.MM.dd").format(new Date());
		String ipStr="";
		String uri="http://101.236.47.119:9200/redis-log-"+dateStr
				+ "/doc/_search?pretty";
		try {
			JSONObject obj=ESConfig.post(uri).getJSONObject("hits");
			JSONArray array=obj.getJSONArray("hits");
			for (int i = 0; i < array.size(); i++) {
				JSONObject ob=array.getJSONObject(i);
				String id=ob.getString("_id");
				JSONObject ob1=ob.getJSONObject("_source");
				String biztype=ob1.getString("biztype");
				//收集過的資料不再收集
				if(!"".equals(biztype)&&biztype!=null&&collectedIDs.indexOf(id)<0){
					String logs=ob1.getString("logString");
					collectedIDs+=id+";\r\n";
					//logs=logs.substring(0, logs.indexOf(":"));
					ipStr+=logs+",\r\n";
				}
			}
			ipStr="".equals(ipStr)?"":ipStr.substring(0, ipStr.lastIndexOf(","));
			collectedIPs+=ipStr;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			WriteLog.write("CheckProxyIPOfFellIn.getIP","收集排隊的代理IP出錯");
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
////		 ipCountMap = new HashMap<String, Integer>();// 每個代理ip的計數
////	    	earlyWarningIp = "";// 預警ip
		generateEarlyWarningIP();
		System.out.println(warnCacheTime);
		System.out.println("id:"+collectedIDs);
		System.out.println("ip:"+collectedIPs);
		System.out.println("排隊ip:"+earlyWarningIp);
//		warning();
//		CheckProxyIPOfFellIn.bjTask();
		isBelong();
	}
	public static Boolean isBelong(){

	    SimpleDateFormat df = new SimpleDateFormat("HH:mm");//設定日期格式
	    Date now =null;
	    Date beginTime = null;
	    Date endTime = null;
	    try {
	        now = df.parse(df.format(new Date()));
	        beginTime = df.parse("00:00");
	        endTime = df.parse("02:00");
	    } catch (Exception e) {
	        e.printStackTrace();
	    }

	    Boolean flag = belongCalendar(now, beginTime, endTime);
	   return flag;
	}


	/**
	     * 判斷時間是否在時間段內
	     * @param nowTime
	     * @param beginTime
	     * @param endTime
	     * @return
	     */
	    public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
	        Calendar date = Calendar.getInstance();
	        date.setTime(nowTime);

	        Calendar begin = Calendar.getInstance();
	        begin.setTime(beginTime);

	        Calendar end = Calendar.getInstance();
	        end.setTime(endTime);

	        if (date.after(begin) && date.before(end)) {
	            return true;
	        } else {
	            return false;
	        }
	    }
}