SystemLogParser.java
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. package org.apache.hadoop.contrib.failmon;
  19. import java.io.IOException;
  20. import java.util.Calendar;
  21. import java.util.regex.Matcher;
  22. import java.util.regex.Pattern;
  23. /**********************************************************
  24.  * An object of this class parses a Unix system log file to create
  25.  * appropriate EventRecords. Currently, only the syslogd logging 
  26.  * daemon is supported.
  27.  * 
  28.  **********************************************************/
  29. public class SystemLogParser extends LogParser {
  30.   static String[] months = { "January", "February", "March", "April", "May",
  31.       "June", "July", "August", "September", "October", "November", "December" };
  32.   /**
  33.    * Create a new parser object .
  34.    */  
  35.   public SystemLogParser(String fname) {
  36.     super(fname);
  37.     if ((dateformat = Environment.getProperty("log.system.dateformat")) == null)
  38.       dateformat = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d+)";
  39.     if ((timeformat = Environment.getProperty("log.system.timeformat")) == null)
  40.       timeformat = "\d{2}:\d{2}:\d{2}";
  41.   }
  42.   /**
  43.    * Parses one line of the log. If the line contains a valid 
  44.    * log entry, then an appropriate EventRecord is returned, after all
  45.    * relevant fields have been parsed.
  46.    *
  47.    *  @param line the log line to be parsed
  48.    *    
  49.    *  @return the EventRecord representing the log entry of the line. If 
  50.    *  the line does not contain a valid log entry, then the EventRecord 
  51.    *  returned has isValid() = false. When the end-of-file has been reached,
  52.    *  null is returned to the caller.
  53.    */
  54.   public EventRecord parseLine(String line) throws IOException {
  55.     EventRecord retval = null;
  56.     if (line != null) {
  57.       // process line
  58.       String patternStr = "(" + dateformat + ")";
  59.       patternStr += "\s+";
  60.       patternStr += "(" + timeformat + ")";
  61.       patternStr += "\s+(\S*)\s"; // for hostname
  62. //      patternStr += "\s*([\w+\.?]+)"; // for source
  63.       patternStr += ":?\s*(.+)"; // for the message
  64.       Pattern pattern = Pattern.compile(patternStr);
  65.       Matcher matcher = pattern.matcher(line);
  66.       if (matcher.find() && matcher.groupCount() >= 0) {
  67.         retval = new EventRecord(hostname, ips, parseDate(matcher.group(1),
  68.             matcher.group(4)), "SystemLog", "Unknown", // loglevel
  69.             "Unknown", // source
  70.             matcher.group(6)); // message
  71.       } else {
  72.         retval = new EventRecord();
  73.       }
  74.     }
  75.     return retval;
  76.   }
  77.   /**
  78.    * Parse a date found in the system log.
  79.    * 
  80.    * @return a Calendar representing the date
  81.    */
  82.   protected Calendar parseDate(String strDate, String strTime) {
  83.     Calendar retval = Calendar.getInstance();
  84.     // set date
  85.     String[] fields = strDate.split("\s+");
  86.     retval.set(Calendar.MONTH, parseMonth(fields[0]));
  87.     retval.set(Calendar.DATE, Integer.parseInt(fields[1]));
  88.     // set time
  89.     fields = strTime.split(":");
  90.     retval.set(Calendar.HOUR_OF_DAY, Integer.parseInt(fields[0]));
  91.     retval.set(Calendar.MINUTE, Integer.parseInt(fields[1]));
  92.     retval.set(Calendar.SECOND, Integer.parseInt(fields[2]));
  93.     return retval;
  94.   }
  95.   /**
  96.    * Convert the name of a month to the corresponding int value.
  97.    * 
  98.    * @return the int representation of the month.
  99.    */
  100.   private int parseMonth(String month) {
  101.     for (int i = 0; i < months.length; i++)
  102.       if (months[i].startsWith(month))
  103.         return i;
  104.     return -1;
  105.   }
  106.   
  107.   /**
  108.    * Return a String with information about this class
  109.    * 
  110.    * @return A String describing this class
  111.    */
  112.   public String getInfo() {
  113.     return ("System Log Parser for file : " + file.getAbsoluteFile());
  114.   }
  115. }