@Override
	public void run() {
		long currentTime = System.currentTimeMillis();
		//generate report
		Map<String, StringBuilder> successLogMap = new HashMap<String, StringBuilder>();
		Map<String, StringBuilder> failLogMap = new HashMap<String, StringBuilder>();
		
		//collect log
		for (TestData data : datas) {
			AbstractApiData testData = (AbstractApiData) data;
			
			//ignore unexpected api data
			Object obj = testData.getMetadat(MisSupportApiData.OUTPUT_RESULT_MAP);
			if (obj == null) {
				logger.warn(String.format("Skip log gen. for api data with no result map![%s][%s]", testData.getClass(), testData.getBaseUrl() + testData.getParameters()));
				continue;
			}
			ResultMap resultMap = (ResultMap) obj;
			

			if ("ok".equals(resultMap.getStatus().toLowerCase().trim())) {
				if (! successLogMap.containsKey(testData.getBaseUrl())) {
					successLogMap.put(testData.getBaseUrl(), new StringBuilder());
				}
				successLogMap.get(testData.getBaseUrl()).append(resultMap.getTestcaseName() + "," + resultMap.getStatus() + "\n");
			} else {
				if (! failLogMap.containsKey(testData.getBaseUrl())) {
					failLogMap.put(testData.getBaseUrl(), new StringBuilder());
				}
				failLogMap.get(testData.getBaseUrl()).append(resultMap.getTestcaseName() + "," + resultMap.getStatus() + "\n");
			}
		}

		for (Entry<String, StringBuilder> row : successLogMap.entrySet()) {
			this.writeToPassLog(currentTime, row.getValue(), row.getKey());
		}

		for (Entry<String, StringBuilder> row : failLogMap.entrySet()) {
			this.writeToFailLog(currentTime, row.getValue(), row.getKey());
		}

	}