package net.i2p.util; /* * free (adj.): unencumbered; not under the control of others * Written by jrandom in 2003 and released into the public domain * with no warranty of any kind, either expressed or implied. * It probably won't make your computer catch on fire, or eat * your children, but it might. Use at your own risk. * */ import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.Date; import net.i2p.I2PAppContext; import net.i2p.data.DataHelper; /** * Render a log record according to the log manager's settings * */ class LogRecordFormatter { final static String NL = System.getProperty("line.separator"); // arbitrary max length for the classname property (this makes is it lines up nicely) private final static int MAX_WHERE_LENGTH = 30; // if we're going to have one for where... be consistent private final static int MAX_THREAD_LENGTH = 12; private final static int MAX_PRIORITY_LENGTH = 5; public static String formatRecord(LogManager manager, LogRecord rec) { return formatRecord(manager, rec, true); } /** * @param showDate if false, skip any date in the format (use when writing to wrapper log) * @since 0.8.2 */ static String formatRecord(LogManager manager, LogRecord rec, boolean showDate) { int size = 128 + rec.getMessage().length(); if (rec.getThrowable() != null) size += 512; StringBuilder buf = new StringBuilder(size); char format[] = manager.getFormat(); for (int i = 0; i < format.length; ++i) { switch (format[i]) { case LogManager.DATE: if (showDate) buf.append(getWhen(manager, rec)); else if (i+1 < format.length && format[i+1] == ' ') i++; // skip following space break; case LogManager.CLASS: buf.append(getWhere(rec)); break; case LogManager.THREAD: buf.append(getThread(rec)); break; case LogManager.PRIORITY: buf.append(getPriority(rec, manager.getContext())); break; case LogManager.MESSAGE: String msg = getWhat(rec); if (msg != null) buf.append(msg); break; default: buf.append(format[i]); break; } } buf.append(NL); if (rec.getThrowable() != null) { StringWriter sw = new StringWriter(512); PrintWriter pw = new PrintWriter(sw); rec.getThrowable().printStackTrace(pw); pw.flush(); buf.append(sw.toString()); } return buf.toString(); } private static String getThread(LogRecord logRecord) { return toString(logRecord.getThreadName(), MAX_THREAD_LENGTH); } public static String getWhen(LogManager manager, LogRecord logRecord) { return manager.getDateFormat().format(new Date(logRecord.getDate())); } /** don't translate */ /**** private static String getPriority(LogRecord rec) { return toString(Log.toLevelString(rec.getPriority()), MAX_PRIORITY_LENGTH); } ****/ /** */ private static final String BUNDLE_NAME = "net.i2p.router.web.messages"; /** translate @since 0.7.14 */ private static String getPriority(LogRecord rec, I2PAppContext ctx) { int len; if (Translate.getLanguage(ctx).equals("de")) len = 8; // KRITISCH else len = MAX_PRIORITY_LENGTH; return toString(Translate.getString(Log.toLevelString(rec.getPriority()), ctx, BUNDLE_NAME), len); } private static String getWhat(LogRecord rec) { return rec.getMessage(); } private static String getWhere(LogRecord rec) { String src = (rec.getSource() != null ? rec.getSource().getName() : rec.getSourceName()); if (src == null) src = "<none>"; return toString(src, MAX_WHERE_LENGTH); } /** truncates or pads to the specified size */ private static String toString(String str, int size) { StringBuilder buf = new StringBuilder(); if (str == null) str = ""; if (str.length() > size) str = str.substring(str.length() - size); buf.append(str); while (buf.length() < size) buf.append(' '); return buf.toString(); } }