Subversion Repositories mkgmap

Rev

Rev 3753 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * Copyright (C) 2007 Steve Ratcliffe
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License version 2 as
 *  published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *
 * Author: Steve Ratcliffe
 * Create date: 08-Sep-2007
 */

package uk.me.parabola.log;

import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Calendar;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

/**
 * Prints the message all on one line, which amazingly is not the default
 * behaviour in j.u.l, no wonder no one uses it.
 *
 * MUST be public whatever crazy static analyzers might say.
 *
 * @author Steve Ratcliffe
 */

public class UsefulFormatter extends Formatter {
        private boolean showTime = true;
        private static final String lineSeparator = System.getProperty("line.separator");


        public String format(LogRecord record) {
                StringBuffer sb = new StringBuffer();

                if (record.getLevel().intValue() <= Level.SEVERE.intValue()) {
                        if (showTime) {
                                long millis = record.getMillis();
                                Calendar cal = Calendar.getInstance();
                                cal.setTimeInMillis(millis);
                                sb.append(cal.get(Calendar.YEAR));
                                sb.append('/');
                                sb.append(fmt2(cal.get(Calendar.MONTH)+1));
                                sb.append('/');
                                sb.append(fmt2(cal.get(Calendar.DAY_OF_MONTH)));
                                sb.append(' ');
                                sb.append(fmt2(cal.get(Calendar.HOUR_OF_DAY)));
                                sb.append(':');
                                sb.append(fmt2(cal.get(Calendar.MINUTE)));
                                sb.append(':');
                                sb.append(fmt2(cal.get(Calendar.SECOND)));
                                sb.append(' ');
                        }
                       
                        sb.append(record.getLevel().getLocalizedName());
                        sb.append(" (");
                        sb.append(shortName(record.getLoggerName()));
                        sb.append("): ");
                }
                sb.append(record.getMessage());
               
                sb.append(lineSeparator);

                Throwable t = record.getThrown();
                if (t != null) {
                        StringWriter out = new StringWriter();
                        PrintWriter pw = new PrintWriter(out);
                        t.printStackTrace(pw);
                        sb.append(out.toString());
                }
                return sb.toString();
        }

        public void setShowTime(boolean showTime) {
                this.showTime = showTime;
        }

        private String fmt2(int i) {
                StringBuffer res = new StringBuffer(String.valueOf(i));
                while (res.length() < 2) {
                        res.insert(0, '0');
                }
                return res.toString();
        }

        private String shortName(String name) {
                int end = name.lastIndexOf('.');
                if (end > 0) {
                        return name.substring(end+1);
                } else
                        return name;
        }
}