private static boolean outputErrorLog(ArrayList<ServerID> servers, String reason) {
		FileWriter outputFile = null;
		BufferedWriter outputBuf = null;
		String logID = Long.toString(new Date().getTime());
		char txnLength = 'M';
		if (minOperations < 15) {
			txnLength = 'S';
		}
		else if (maxOperations > 30) {
			txnLength = 'L';
		}
		logID = "" + proof.charAt(0) + validationMode + policyPush + txnLength + logID.substring(3);
		String filename = "Log_ERROR_" + logID + ".txt";
		boolean success = true;
		long avgFullTxn = 0l; // Start to finish
		long avgTxnTime = 0l; // Reads and writes only
		long avgCommitTime = 0l; // From commit call to finish
		
		// Create an output stream
		try {			
			outputFile = new FileWriter(filename, true);
			// create a BufferedWriter object for the output methods
			outputBuf = new BufferedWriter(outputFile);
		}
		catch(IOException ioe) {
			System.out.println("IOException during output file creation.");
			ioe.printStackTrace();
			success = false;
		}
		
		// Write to file
		try {
			outputBuf.write("ERROR:");
			outputBuf.newLine();
			outputBuf.write(reason);
			outputBuf.newLine();
			outputBuf.write("PARAMETERS:");
			outputBuf.newLine();
			outputBuf.write("PROOF=" + proof);
			outputBuf.newLine();
			outputBuf.write("VM=" + validationMode);
			outputBuf.newLine();
			outputBuf.write("PUSH=" + policyPush);
			outputBuf.newLine();
			outputBuf.write("MT=" + maxTransactions);
			outputBuf.newLine();
			outputBuf.write("OPMIN=" + minOperations);
			outputBuf.newLine();
			outputBuf.write("OPMAX=" + maxOperations);
			outputBuf.newLine();
			outputBuf.write("MS=" + maxServers);
			outputBuf.newLine();
			outputBuf.write("MD=" + maxDegree);
			outputBuf.newLine();
			outputBuf.write("LMIN=" + latencyMin);
			outputBuf.newLine();
			outputBuf.write("LMAX=" + latencyMax);
			outputBuf.newLine();
			outputBuf.write("SLEEP=" + threadSleep);
			outputBuf.newLine();
			outputBuf.write("ICSR=" + integrityCheckSuccessRate);
			outputBuf.newLine();
			outputBuf.write("LASR=" + localAuthSuccessRate);
			outputBuf.newLine();
			outputBuf.write("PMIN=" + policyUpdateMin);
			outputBuf.newLine();
			outputBuf.write("PMAX=" + policyUpdateMax);
			outputBuf.newLine();
			outputBuf.write("RS1=" + randomSeed1);
			outputBuf.newLine();
			outputBuf.write("RS2=" + randomSeed2);
			outputBuf.newLine();
			outputBuf.write("RS3=" + randomSeed3);
			outputBuf.newLine();		}
		catch(IOException ioe) {
			System.out.println("IOException while writing to output file.");
			ioe.printStackTrace();
			success = false;
		}
		
		// Close the output stream
		try {
			outputBuf.close();
		}
		catch(IOException ioe) {
			System.out.println("IOException while closing the output file.");
			ioe.printStackTrace();
			success = false;
		}
		
		// Shut down Policy Server, Cloud Servers
		for (int i = 0; i <= maxServers; i++) {
			try {
				// Connect to the specified server
				Socket sock = new Socket(servers.get(i).getAddress(),
										 servers.get(i).getPort());
				// Set up I/O streams with the server
				ObjectOutputStream output = new ObjectOutputStream(sock.getOutputStream());
				ObjectInputStream input = new ObjectInputStream(sock.getInputStream());
				// Send KILL
				output.writeObject(new Message("KILL"));
				// Disconnect from server
				sock.close();
			}
			catch (ConnectException ce) {
				System.err.println(ce.getMessage() +
								   ": Check server address and port number.");
				ce.printStackTrace(System.err);
			}
			catch (Exception e) {
				System.err.println("Error during KILL: " + e.getMessage());
				e.printStackTrace(System.err);
			}
		}
		
		
		return success;
	}