001/**
002 *
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *     http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing, software
014 * distributed under the License is distributed on an "AS IS" BASIS,
015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
016 * See the License for the specific language governing permissions and
017 * limitations under the License.
018 */
019package org.apache.hadoop.hbase.util;
020
021import java.io.BufferedReader;
022import java.io.File;
023import java.io.FileInputStream;
024import java.io.IOException;
025import java.io.InputStreamReader;
026import java.io.PrintWriter;
027import java.nio.channels.FileChannel;
028import java.util.Set;
029import org.apache.hadoop.hbase.logging.Log4jUtils;
030import org.apache.hadoop.io.IOUtils;
031import org.apache.yetus.audience.InterfaceAudience;
032
033/**
034 * Utility functions for reading the log4j logs that are being written by HBase.
035 */
036@InterfaceAudience.Private
037public abstract class LogMonitoring {
038
039  public static void dumpTailOfLogs(PrintWriter out, long tailKb) throws IOException {
040    Set<File> logs = Log4jUtils.getActiveLogFiles();
041    for (File f : logs) {
042      out.println("+++++++++++++++++++++++++++++++");
043      out.println(f.getAbsolutePath());
044      out.println("+++++++++++++++++++++++++++++++");
045      try {
046        dumpTailOfLog(f, out, tailKb);
047      } catch (IOException ioe) {
048        out.println("Unable to dump log at " + f);
049        ioe.printStackTrace(out);
050      }
051      out.println("\n\n");
052    }
053  }
054
055  private static void dumpTailOfLog(File f, PrintWriter out, long tailKb) throws IOException {
056    FileInputStream fis = new FileInputStream(f);
057    BufferedReader r = null;
058    try {
059      FileChannel channel = fis.getChannel();
060      channel.position(Math.max(0, channel.size() - tailKb * 1024));
061      r = new BufferedReader(new InputStreamReader(fis));
062      r.readLine(); // skip the first partial line
063      String line;
064      while ((line = r.readLine()) != null) {
065        out.println(line);
066      }
067    } finally {
068      if (r != null) {
069        IOUtils.closeStream(r);
070      }
071      IOUtils.closeStream(fis);
072    }
073  }
074}