blob: 0ef7ba0e382eacbeb4cc79c282339d31d1fcee88 [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.IOException;
import java.util.Calendar;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**********************************************************
* An object of this class parses a Unix system log file to create
* appropriate EventRecords. Currently, only the syslogd logging
* daemon is supported.
*
**********************************************************/
public class SystemLogParser extends LogParser {
static String[] months = { "January", "February", "March", "April", "May",
"June", "July", "August", "September", "October", "November", "December" };
/**
* Create a new parser object .
*/
public SystemLogParser(String fname) {
super(fname);
if ((dateformat = Environment.getProperty("log.system.dateformat")) == null)
dateformat = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s+(\\d+)";
if ((timeformat = Environment.getProperty("log.system.timeformat")) == null)
timeformat = "\\d{2}:\\d{2}:\\d{2}";
}
/**
* Parses one line of the log. If the line contains a valid
* log entry, then an appropriate EventRecord is returned, after all
* relevant fields have been parsed.
*
* @param line the log line to be parsed
*
* @return the EventRecord representing the log entry of the line. If
* the line does not contain a valid log entry, then the EventRecord
* returned has isValid() = false. When the end-of-file has been reached,
* null is returned to the caller.
*/
public EventRecord parseLine(String line) throws IOException {
EventRecord retval = null;
if (line != null) {
// process line
String patternStr = "(" + dateformat + ")";
patternStr += "\\s+";
patternStr += "(" + timeformat + ")";
patternStr += "\\s+(\\S*)\\s"; // for hostname
// patternStr += "\\s*([\\w+\\.?]+)"; // for source
patternStr += ":?\\s*(.+)"; // for the message
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(line);
if (matcher.find() && matcher.groupCount() >= 0) {
retval = new EventRecord(hostname, ips, parseDate(matcher.group(1),
matcher.group(4)), "SystemLog", "Unknown", // loglevel
"Unknown", // source
matcher.group(6)); // message
} else {
retval = new EventRecord();
}
}
return retval;
}
/**
* Parse a date found in the system log.
*
* @return a Calendar representing the date
*/
protected Calendar parseDate(String strDate, String strTime) {
Calendar retval = Calendar.getInstance();
// set date
String[] fields = strDate.split("\\s+");
retval.set(Calendar.MONTH, parseMonth(fields[0]));
retval.set(Calendar.DATE, Integer.parseInt(fields[1]));
// set time
fields = strTime.split(":");
retval.set(Calendar.HOUR_OF_DAY, Integer.parseInt(fields[0]));
retval.set(Calendar.MINUTE, Integer.parseInt(fields[1]));
retval.set(Calendar.SECOND, Integer.parseInt(fields[2]));
return retval;
}
/**
* Convert the name of a month to the corresponding int value.
*
* @return the int representation of the month.
*/
private int parseMonth(String month) {
for (int i = 0; i < months.length; i++)
if (months[i].startsWith(month))
return i;
return -1;
}
/**
* Return a String with information about this class
*
* @return A String describing this class
*/
public String getInfo() {
return ("System Log Parser for file : " + file.getAbsoluteFile());
}
}