package org.yamcs; import java.text.SimpleDateFormat; import java.util.Date; import java.util.logging.Formatter; import java.util.logging.Level; import java.util.logging.LogRecord; /** * Specifically intended for short-term console output. It contains the bare minimum of information. * Memory optimization is 'good enough' for console output. * * Intentional alterations: * <ul> * <li>Hide the day, only the hour is shown * <li>Hide the logger names for central classes * <li>Hide the 'INFO' string, since it's redundant. Only show when it's not INFO * <li>Hide the method name * <li>Support minimal colors * </ul> */ public class ConsoleFormatter extends Formatter { private static final String COLOR_PREFIX= "\033["; private static final String COLOR_SUFFIX = "m"; private static final String COLOR_RESET = "\033[0;0m"; SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss.SSS"); Date d=new Date(); @Override public String format(LogRecord r) { d.setTime(r.getMillis()); StringBuilder sb=new StringBuilder(); String name=r.getLoggerName();; String decoration; sb.append(sdf.format(d)); sb.append(" [").append(r.getThreadID()).append("] "); if (name.lastIndexOf('.')!=-1) { name=name.substring(name.lastIndexOf('.') + 1); } if (name.lastIndexOf('[')!=-1) { decoration=name.substring(name.lastIndexOf('[') + 1, name.length() - 1); name=name.substring(0, name.lastIndexOf('[')); } else { decoration=null; } colorize(sb, name, 0, 36); sb.append(" "); if (decoration!=null) { colorize(sb, decoration, 0, 35); sb.append(" "); } if (r.getLevel() == Level.WARNING || r.getLevel() == Level.SEVERE) { colorize(sb, r.getLevel().toString(), 0, 31); sb.append(" "); } else if (r.getLevel() != Level.INFO) { sb.append(r.getLevel()).append(" "); } sb.append(r.getMessage()); Object[] params=r.getParameters(); if(params!=null) { for(Object p:params) { sb.append(p.toString()); } } Throwable t=r.getThrown(); if(t!=null) { sb.append(": ").append(t.toString()).append("\n"); for(StackTraceElement ste:t.getStackTrace()) { sb.append("\t").append(ste.toString()).append("\n"); } Throwable cause=t.getCause(); while(cause!=null && cause!=t) { sb.append("Caused by: ").append(cause.toString()).append("\n"); for(StackTraceElement ste:cause.getStackTrace()) { sb.append("\t").append(ste.toString()).append("\n"); } cause=cause.getCause(); } } sb.append("\n"); return sb.toString(); } private static void colorize(StringBuilder buf, String s, int brightness, int ansiColor) { buf.append(COLOR_PREFIX).append(brightness).append(';').append(ansiColor).append(COLOR_SUFFIX); buf.append(s); buf.append(COLOR_RESET); } }