package net.tuis.ubench; import java.io.CharArrayWriter; import java.io.PrintWriter; import java.util.logging.Formatter; import java.util.logging.LogRecord; class InlineFormatter extends Formatter { private static final ThreadLocal<CharArrayWriter> chars = ThreadLocal.withInitial(CharArrayWriter::new); private static final class TraceWriter extends PrintWriter { public TraceWriter() { super(chars.get()); } } private static final ThreadLocal<TraceWriter> writers = ThreadLocal.withInitial(TraceWriter::new); @Override public String format(LogRecord log) { String msg = formatMessage(log); return String.format("%-6s %tF %<tT.%<tL %s(%s): %s\n%s", log.getLevel(), log.getMillis(), log.getSourceClassName(), log.getSourceMethodName(), msg, dumpStack(log.getThrown())); } private String dumpStack(final Throwable thrown) { if (thrown == null) { return ""; } try (PrintWriter pw = writers.get()) { thrown.printStackTrace(pw); pw.flush(); String data = new String(chars.get().toString()); chars.get().reset(); return data; } } }