blob: aaa6b17a9bb01490d608e8dd79787488a5c69f96 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.contrib.failmon;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
/**********************************************************
* This class can be used to anonymize logs independently of
* Hadoop and the Executor. It parses the specified log file to
* create log records for it and then passes them to the Anonymizer.
* After they are anonymized, they are written to a local file,
* which is then compressed and stored locally.
*
**********************************************************/
public class OfflineAnonymizer {
public enum LogType {
HADOOP, SYSTEM
};
LogType logtype;
File logfile;
LogParser parser;
/**
* Creates an OfflineAnonymizer for a specific log file.
*
* @param logtype the type of the log file. This can either be
* LogFile.HADOOP or LogFile.SYSTEM
* @param filename the path to the log file
*
*/
public OfflineAnonymizer(LogType logtype, String filename) {
logfile = new File(filename);
if (!logfile.exists()) {
System.err.println("Input file does not exist!");
System.exit(0);
}
if (logtype == LogType.HADOOP)
parser = new HadoopLogParser(filename);
else
parser = new SystemLogParser(filename);
}
/**
* Performs anonymization for the log file. Log entries are
* read one by one and EventRecords are created, which are then
* anonymized and written to the output.
*
*/
public void anonymize() throws Exception {
EventRecord er = null;
SerializedRecord sr = null;
BufferedWriter bfw = new BufferedWriter(new FileWriter(logfile.getName()
+ ".anonymized"));
System.out.println("Anonymizing log records...");
while ((er = parser.getNext()) != null) {
if (er.isValid()) {
sr = new SerializedRecord(er);
Anonymizer.anonymize(sr);
bfw.write(LocalStore.pack(sr).toString());
bfw.write(LocalStore.RECORD_SEPARATOR);
}
}
bfw.flush();
bfw.close();
System.out.println("Anonymized log records written to " + logfile.getName()
+ ".anonymized");
System.out.println("Compressing output file...");
LocalStore.zipCompress(logfile.getName() + ".anonymized");
System.out.println("Compressed output file written to " + logfile.getName()
+ ".anonymized" + LocalStore.COMPRESSION_SUFFIX);
}
public static void main(String[] args) {
if (args.length < 2) {
System.out.println("Usage: OfflineAnonymizer <log_type> <filename>");
System.out
.println("where <log_type> is either \"hadoop\" or \"system\" and <filename> is the path to the log file");
System.exit(0);
}
LogType logtype = null;
if (args[0].equalsIgnoreCase("-hadoop"))
logtype = LogType.HADOOP;
else if (args[0].equalsIgnoreCase("-system"))
logtype = LogType.SYSTEM;
else {
System.err.println("Invalid first argument.");
System.exit(0);
}
OfflineAnonymizer oa = new OfflineAnonymizer(logtype, args[1]);
try {
oa.anonymize();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}