001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *     http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing, software
013 * distributed under the License is distributed on an "AS IS" BASIS,
014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018package org.apache.hadoop.hbase.util;
019
020import java.io.BufferedReader;
021import java.io.File;
022import java.io.FileInputStream;
023import java.io.IOException;
024import java.io.InputStreamReader;
025import java.io.PrintWriter;
026import java.nio.channels.FileChannel;
027import java.nio.charset.StandardCharsets;
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, StandardCharsets.UTF_8));
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) IOUtils.closeStream(r);
069      IOUtils.closeStream(fis);
070    }
071  }
072}