public synchronized void miningByStep(String log){
		
		int maxSize = 2 * maxGap + 1;
				
		// 如果currentLogs.size < maxSize, 则直接添加新log
		if(currentLogs.size() < maxSize){
			currentLogs.add(log);
		}
		// 如果currentLogs.size >= maxSize, 则需要剔除最老的log，再添加新log
		else{
			currentLogs.remove(0);
			currentLogs.add(log);
		}
		
		// 根据规则 Ai & Aj -> Ak, i < j < k, j - i <= maxGap, k - j <= maxGap 生成新规则
		// 从后向前，确定maxGap的区间找prefix
		int lastPos = currentLogs.size() - 1;
		for(int j = lastPos - 1; j >= lastPos - maxGap && j >= 1; j --){
			// 类似  a|b -> b 这种规则不生成
			if(currentLogs.get(j).equals(log)){
				continue;
			}
			
			for(int i = j - 1; i >= j - maxGap && i >= 0; i--){
				
				// 类似 a|b -> a 这种规则不生成
				if(currentLogs.get(i).equals(log)){
					continue;
				}
				
				ruleCache.addRule(currentLogs.get(i) + "|" + currentLogs.get(j), log);
			}
		}
	}