franta-hg@8: /** franta-hg@8: * copy-image-resizer franta-hg@8: * Copyright © 2013 František Kučera (frantovo.cz) franta-hg@8: * franta-hg@8: * This program is free software: you can redistribute it and/or modify franta-hg@8: * it under the terms of the GNU General Public License as published by franta-hg@8: * the Free Software Foundation, either version 3 of the License, or franta-hg@8: * (at your option) any later version. franta-hg@8: * franta-hg@8: * This program is distributed in the hope that it will be useful, franta-hg@8: * but WITHOUT ANY WARRANTY; without even the implied warranty of franta-hg@8: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the franta-hg@8: * GNU General Public License for more details. franta-hg@8: * franta-hg@8: * You should have received a copy of the GNU General Public License franta-hg@8: * along with this program. If not, see . franta-hg@8: */ franta-hg@8: package cz.frantovo.copyImageResizer.logging; franta-hg@8: franta-hg@16: import java.io.PrintWriter; franta-hg@8: import java.io.StringWriter; franta-hg@16: import java.text.SimpleDateFormat; franta-hg@16: import java.util.Date; franta-hg@8: import java.util.logging.Level; franta-hg@8: import java.util.logging.LogRecord; franta-hg@8: franta-hg@8: /** franta-hg@8: * For console/terminal log output. Log messages are printed in brief and colorful form. franta-hg@8: * franta-hg@8: * @author Ing. František Kučera (frantovo.cz) franta-hg@8: */ franta-hg@16: public class SimpleFormatter extends AbstractFormatter { franta-hg@8: franta-hg@16: private static final ThreadLocal dateFormatter = new ThreadLocal() { franta-hg@16: franta-hg@16: @Override franta-hg@16: protected SimpleDateFormat initialValue() { franta-hg@16: return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); franta-hg@16: } franta-hg@16: franta-hg@16: }; franta-hg@8: franta-hg@8: @Override franta-hg@8: public String format(LogRecord r) { franta-hg@16: StringBuilder sb = new StringBuilder(); franta-hg@16: franta-hg@16: printTimestamp(sb, new Date(r.getMillis())); franta-hg@16: printSeparator(sb); franta-hg@16: printLevel(sb, r.getLevel()); franta-hg@16: printSeparator(sb); franta-hg@16: printMessage(sb, r); franta-hg@16: printSeparator(sb); franta-hg@16: printThrowable(sb, r); franta-hg@16: sb.append("\n"); franta-hg@16: franta-hg@16: return sb.toString(); franta-hg@8: } franta-hg@8: franta-hg@16: private void printSeparator(StringBuilder out) { franta-hg@16: out.append(" | "); franta-hg@16: } franta-hg@16: franta-hg@16: private void printTimestamp(StringBuilder out, Date date) { franta-hg@16: out.append(dateFormatter.get().format(date)); franta-hg@16: } franta-hg@16: franta-hg@16: private void printLevel(StringBuilder out, Level l) { franta-hg@8: franta-hg@8: if (l == Level.SEVERE) { franta-hg@16: out.append(rpad("ERROR", 10)); franta-hg@16: } else if (l == Level.INFO) { franta-hg@16: out.append(rpad("OK", 10)); franta-hg@16: } else { franta-hg@16: out.append(rpad(l.getName(), 10)); franta-hg@8: } franta-hg@8: } franta-hg@8: franta-hg@16: private void printMessage(StringBuilder out, LogRecord r) { franta-hg@16: String message = formatMessage(r); franta-hg@16: // convert to single-line message franta-hg@16: message = message.replaceAll("\\\\", "\\\\"); // escape backslashes franta-hg@16: message = message.replaceAll("\\n", "\\n"); // escape line ends franta-hg@16: out.append(message); franta-hg@8: } franta-hg@8: franta-hg@16: private void printThrowable(StringBuilder out, LogRecord r) { franta-hg@8: Throwable t = r.getThrown(); franta-hg@8: if (t != null) { franta-hg@16: out.append(t.getClass().getSimpleName()); franta-hg@8: String message = t.getLocalizedMessage(); franta-hg@8: if (message != null) { franta-hg@16: out.append(": "); franta-hg@16: out.append(message); franta-hg@8: } franta-hg@16: if (isPrintStacktrace()) { franta-hg@16: out.append("\n"); franta-hg@16: StringWriter sw = new StringWriter(); franta-hg@16: t.printStackTrace(new PrintWriter(sw)); franta-hg@16: out.append(sw.toString()); franta-hg@8: } franta-hg@8: } franta-hg@8: } franta-hg@8: }