Package com.linkedin.databus.core

Source Code of com.linkedin.databus.core.DbusLogAccumulator

package com.linkedin.databus.core;

/*
*
* Copyright 2013 LinkedIn Corp. All rights reserved
*
* Licensed 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.
*
*/

import java.util.IllegalFormatException;

import org.apache.commons.collections.buffer.CircularFifoBuffer;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;


/**
* A class that allows for accumulating log messages with a limit
* on the number of messages that can be retained
*
*/
public class DbusLogAccumulator
{
  /**
   *  DbusLogAccumulator is responsible for buffering data,
   *  and DbusPrettyLogUtils for outputting it to a log
   */

  public static final int MAX_NUMBER_OF_LOG_MSGS = 256;
  private int _totalNumberOfMsgs; // actual number of messages
  private final CircularFifoBuffer _msgs;

  /**
   * DO NOT USE. needs to be removed
   * this method directly prints out the log message
   * @param s
   * @param log
   */
  @Deprecated
  public static void addLog(String s, Logger log) {
    if (null == log)
      return;

    if(log.isDebugEnabled())
      log.debug(s);
  }

  public DbusLogAccumulator() {
    this(MAX_NUMBER_OF_LOG_MSGS);
  }

  public DbusLogAccumulator(int maxNumberMsgs) {
    _msgs = new CircularFifoBuffer(maxNumberMsgs);
    reset();
  }

  public void reset() {
    _msgs.clear();
    _totalNumberOfMsgs = 0;
  }

  /**
   * Auxiliary message. Avoid using this method if passing a complex string (s+s1+s2+s3...)
   * @param msg as a string
   */
  public void addMessage(String msg) {
    addMessage(new DebugMessage(msg));
  }

  public void addMessage(String format, Object val) {
    addMessage(new DebugMessage(format, val));
  }

  /**
   * Add a new message (without converting it to a String)
   * @param msg as format + args
   */
  public void addMessage(DebugMessage msg) {
    _msgs.add(msg);
    ++ _totalNumberOfMsgs;
  }

  /**
   * Total number of messages (including the overwritten ones)
   * @return total number of messages added to the accumulator
   */
  public int getTotalNumberOfMessages() {
    return _totalNumberOfMsgs;
  }

  /**
   * Number of stored/available messages
   * @return number of stored messages
   */
  public int getNumberOfMessages() {
    return _msgs.size();
  }

  /**
   * Print all the messages
   * @param log
   * @param level
   */
  public void prettyLog(Logger log, Level level) {
    for(Object o : _msgs) {
      DebugMessage dm = (DebugMessage) o;
      String msg = dm.toString();
      Throwable t = dm.getException();
      DbusPrettyLogUtils.logAtLevel(msg, t, log, level);
    }
  }

  /**
   * Each log line is stored as DebugMessage
   * and its content is constructed on demand only
   */
  public static class DebugMessage {
    final private String _format;
    final private Object [] _params;
    private Throwable _exception;

    public DebugMessage(String format, Object... params) {
      _format = format;
      _params = params;
      _exception = null;
    }

    public DebugMessage(String msg) {
      this(null, new Object [] {msg});
    }
    public DebugMessage setException(Throwable e) {
      _exception = e;
      return this;
    }
    public Throwable getException() {
      return _exception;
    }

    @Override
    public String toString() {
      if(_format != null) {
        try {
          return String.format(_format, _params);
        } catch (IllegalFormatException e) {
          return  "failed to format with " + _format + ":" +  e.getMessage();
        }
      }

      if(_params[0] == null)
        return "null";

      return _params[0].toString();
    }
  }
}
TOP

Related Classes of com.linkedin.databus.core.DbusLogAccumulator

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.