Package

Source Code of Logging

import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
import java.util.logging.Logger;

public class Logging {
  private static final Logger log = Logger.getLogger("Logging");

  private static class MyHandler extends Handler {
    private static final int NAME_WIDTH = 18;
    private static final int METHOD_WIDTH = 20;
    private static final int LEVEL_WIDTH = 8;

    public Object clone() { return this; }
    public void close() { }
    public void flush() { }

    private void maybeLogThrown(StringBuilder sb, Throwable t) {
      if (t != null) {
        sb.append("\nCaused by: ");
        sb.append(t.getClass().getName());
        sb.append(": ");
        sb.append(t.getMessage());
        sb.append('\n');

        for (StackTraceElement elt : t.getStackTrace()) {
          sb.append('\t');
          sb.append(elt.getClassName());
          sb.append('.');
          sb.append(elt.getMethodName());
          sb.append('(');
          sb.append(elt.getFileName());
          sb.append(':');
          sb.append(elt.getLineNumber());
          sb.append(')');
          sb.append('\n');
        }
        maybeLogThrown(sb, t.getCause());
      }
    }

    private void indent(StringBuilder sb, int amount) {
      do {
        sb.append(' ');
      } while (--amount > 0);
    }

    public void publish(LogRecord r) {
      StringBuilder sb = new StringBuilder();
      sb.append(r.getLoggerName());
      indent(sb, NAME_WIDTH - r.getLoggerName().length());
      String methodName = r.getSourceMethodName();
      if (methodName == null) {
        methodName = "<unknown>";
      }
      sb.append(methodName);
      indent(sb, METHOD_WIDTH - methodName.length());
      sb.append(r.getLevel().getName());
      indent(sb, LEVEL_WIDTH - r.getLevel().getName().length());
      sb.append(r.getMessage());
      maybeLogThrown(sb, r.getThrown());
      System.out.println(sb.toString());
    }
  }

  public void run() {
    log.info("Started run");
    a();
    log.log(Level.INFO, "Ended {}!", "run");
  }

  private void a() {
    log.fine("Started a()");
    b();
  }

  private void b() {
    log.info("Started b()");
    c();
  }

  private void c() {
    log.warning("Started c()");
    try {
      d();
    } catch (Exception ex) {
      log.log(Level.SEVERE, "Exception caught in c", ex);
    }
  }

  private void d() throws Exception {
    e();
  }

  private void e() throws Exception {
    throw new Exception("Started here");
  }
 
  private static void expect(boolean v) {
    if (! v) throw new RuntimeException();
  }

  private static final boolean useCustomHandler = true;
  public static void main(String args[]) {
    if (useCustomHandler) {
      Logger root = Logger.getLogger("");
      root.addHandler(new MyHandler());
      for (Handler h : root.getHandlers()) root.removeHandler(h);
      root.addHandler(new MyHandler());
    }

    Logging me = new Logging();
    me.run();

    { final boolean[] logged = new boolean[1];
      Logger root = Logger.getLogger("");
      for (Handler h : root.getHandlers()) root.removeHandler(h);
      root.setLevel(Level.FINER);
      root.addHandler(new Handler() {
          public void publish(LogRecord r) {
            logged[0] = true;
          }

          public void close() { }
          public void flush() { }
        });
     
      Logger foo = Logger.getLogger("foo");
      expect(foo.getLevel() == null);
      expect(foo.getParent() == root);

      foo.info("hi");
      expect(logged[0]);

      logged[0] = false;
      foo.fine("hi");
      expect(logged[0]);

      logged[0] = false;
      foo.finest("hi");
      expect(! logged[0]);

      root.setLevel(Level.FINEST);

      logged[0] = false;
      foo.finest("hi");
      expect(logged[0]);
    }     
  }
}
TOP

Related Classes of Logging

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.