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

网格计算

开发平台:

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.BufferedReader;
  20. import java.io.File;
  21. import java.io.FileNotFoundException;
  22. import java.io.FileReader;
  23. import java.io.IOException;
  24. import java.net.InetAddress;
  25. import java.net.UnknownHostException;
  26. import java.util.ArrayList;
  27. import java.util.Calendar;
  28. /**********************************************************
  29.  * This class represents objects that provide log parsing 
  30.  * functionality. Typically, such objects read log files line
  31.  * by line and for each log entry they identify, they create a 
  32.  * corresponding EventRecord. In this way, disparate log files
  33.  * can be merged using the uniform format of EventRecords and can,
  34.  * thus, be processed in a uniform way.
  35.  * 
  36.  **********************************************************/
  37. public abstract class LogParser implements Monitored {
  38.   File file;
  39.   BufferedReader reader;
  40.   String hostname;
  41.   Object [] ips;
  42.   String dateformat;
  43.   String timeformat;
  44.   private String firstLine;
  45.   private long offset;
  46.   /**
  47.    * Create a parser that will read from the specified log file.
  48.    * 
  49.    * @param fname the filename of the log file to be read
  50.    */
  51.   public LogParser(String fname) {
  52.     file = new File(fname);
  53.     ParseState ps = PersistentState.getState(file.getAbsolutePath());
  54.     firstLine = ps.firstLine;
  55.     offset = ps.offset;
  56.     
  57.     try {
  58.       reader = new BufferedReader(new FileReader(file));
  59.       checkForRotation();
  60.       Environment.logInfo("Checked for rotation...");
  61.       reader.skip(offset);
  62.     } catch (FileNotFoundException e) {
  63.       System.err.println(e.getMessage());
  64.       e.printStackTrace();
  65.     } catch (IOException e) {
  66.       System.err.println(e.getMessage());
  67.       e.printStackTrace();
  68.     }
  69.     setNetworkProperties();
  70.   }
  71.   protected void setNetworkProperties() {
  72.     // determine hostname and ip addresses for the node
  73.     try {
  74.       // Get hostname
  75.       hostname = InetAddress.getLocalHost().getCanonicalHostName();
  76.       // Get all associated ip addresses
  77.       ips = InetAddress.getAllByName(hostname);
  78.     } catch (UnknownHostException e) {
  79.       e.printStackTrace();
  80.     }
  81.   }
  82.   /**
  83.    * Insert all EventRecords that can be extracted for
  84.    * the represented hardware component into a LocalStore.
  85.    * 
  86.    * @param ls the LocalStore into which the EventRecords 
  87.    * are to be stored.
  88.    */
  89.   public void monitor(LocalStore ls) {
  90.     int in = 0;
  91.     EventRecord er = null;
  92.     Environment.logInfo("Started processing log...");
  93.     while ((er = getNext()) != null) {
  94.       // Environment.logInfo("Processing log line:t" + in++);
  95.       if (er.isValid()) {
  96.         ls.insert(er);
  97.       }
  98.     }
  99.     PersistentState.updateState(file.getAbsolutePath(), firstLine, offset);
  100.     PersistentState.writeState("conf/parsing.state");
  101.   }
  102.   /**
  103.    * Get an array of all EventRecords that can be extracted for
  104.    * the represented hardware component.
  105.    * 
  106.    * @return The array of EventRecords
  107.    */
  108.   public EventRecord[] monitor() {
  109.     ArrayList<EventRecord> recs = new ArrayList<EventRecord>();
  110.     EventRecord er;
  111.     while ((er = getNext()) != null)
  112.       recs.add(er);
  113.     EventRecord[] T = new EventRecord[recs.size()];
  114.     return recs.toArray(T);
  115.   }
  116.   /**
  117.    * Continue parsing the log file until a valid log entry is identified.
  118.    * When one such entry is found, parse it and return a corresponding EventRecord.
  119.    * 
  120.    *  
  121.    * @return The EventRecord corresponding to the next log entry
  122.    */
  123.   public EventRecord getNext() {
  124.     try {
  125. String line = reader.readLine();
  126. if (line != null) {
  127.     if (firstLine == null)
  128. firstLine = new String(line);
  129.     offset += line.length() + 1;
  130.     return parseLine(line);
  131. }
  132.     } catch (IOException e) {
  133.       e.printStackTrace();
  134.     }
  135.     return null;
  136.   }
  137.   /**
  138.    * Return the BufferedReader, that reads the log file
  139.    *  
  140.    * @return The BufferedReader that reads the log file
  141.    */
  142.   public BufferedReader getReader() {
  143.     return reader;
  144.   }
  145.   /**
  146.    * Check whether the log file has been rotated. If so,
  147.    * start reading the file from the beginning.
  148.    *  
  149.    */
  150.   public void checkForRotation() {
  151.     try {
  152.       BufferedReader probe = new BufferedReader(new FileReader(file.getAbsoluteFile()));
  153.       if (firstLine == null || (!firstLine.equals(probe.readLine()))) {
  154. probe.close();
  155. // start reading the file from the beginning
  156.         reader.close();
  157.         reader = new BufferedReader(new FileReader(file.getAbsoluteFile()));
  158. firstLine = null;
  159. offset = 0;
  160.       }
  161.     } catch (IOException e) {
  162.       e.printStackTrace();
  163.     }
  164.   }
  165.   /**
  166.    * Parses one line of the log. If the line contains a valid 
  167.    * log entry, then an appropriate EventRecord is returned, after all
  168.    * relevant fields have been parsed.
  169.    *
  170.    *  @param line the log line to be parsed
  171.    *
  172.    *  @return the EventRecord representing the log entry of the line. If 
  173.    *  the line does not contain a valid log entry, then the EventRecord 
  174.    *  returned has isValid() = false. When the end-of-file has been reached,
  175.    *  null is returned to the caller.
  176.    */
  177.   abstract public EventRecord parseLine(String line) throws IOException;
  178.   /**
  179.    * Parse a date found in Hadoop log file.
  180.    * 
  181.    * @return a Calendar representing the date
  182.    */
  183.   abstract protected Calendar parseDate(String strDate, String strTime);
  184. }