01: /*
02: * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved
03: *
04: * This file is part of Resin(R) Open Source
05: *
06: * Each copy or derived work must preserve the copyright notice and this
07: * notice unmodified.
08: *
09: * Resin Open Source is free software; you can redistribute it and/or modify
10: * it under the terms of the GNU General Public License as published by
11: * the Free Software Foundation; either version 2 of the License, or
12: * (at your option) any later version.
13: *
14: * Resin Open Source is distributed in the hope that it will be useful,
15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
16: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty
17: * of NON-INFRINGEMENT. See the GNU General Public License for more
18: * details.
19: *
20: * You should have received a copy of the GNU General Public License
21: * along with Resin Open Source; if not, write to the
22: * Free SoftwareFoundation, Inc.
23: * 59 Temple Place, Suite 330
24: * Boston, MA 02111-1307 USA
25: *
26: * @author Scott Ferguson
27: */
28:
29: package com.caucho.log;
30:
31: import com.caucho.vfs.StringWriter;
32: import com.caucho.vfs.WriteStream;
33:
34: import java.util.logging.Formatter;
35: import java.util.logging.LogRecord;
36:
37: /**
38: * A simple formatter that handles localization, substitution of
39: * parameters, and the inclusion of an exception stack trace if applicable.
40: */
41: public class MessageFormatter extends Formatter {
42: public String format(LogRecord record) {
43: return formatMessage(record);
44: }
45:
46: /**
47: * The "formatted" log message, after localization, substitution of
48: * parameters, and the inclusion of an exception stack trace if applicable.
49: * <p>
50: * During formatting, if the source logger has a localization
51: * ResourceBundle and if that ResourceBundle has an entry for
52: * this message string, then the message string is replaced
53: * with the localized value.
54: * <p>
55: * If the message has parameters, java.text.MessageFormat is used to format
56: * the message with the parameters.
57: * <p>
58: * If the log record has an associated exception, the stack trace is
59: * appended to the log message.
60: *
61: * @see java.text.MessageFormat
62: * @see java.lang.Throwable.printStackTrace()
63: */
64: public String formatMessage(LogRecord record) {
65: String message = super .formatMessage(record);
66: Throwable thrown = record.getThrown();
67:
68: try {
69: if (thrown != null) {
70: StringWriter sw = new StringWriter();
71: WriteStream os = sw.openWrite();
72:
73: if (message != null
74: && !message.equals(thrown.toString())
75: && !message.equals(thrown.getMessage()))
76: os.println(message);
77:
78: Throwable rootExn = thrown;
79:
80: // server/023g
81: /*
82: for (;
83: rootExn != null && rootExn.getCause() != null;
84: rootExn = rootExn.getCause()) {
85: }
86: */
87: rootExn.printStackTrace(os.getPrintWriter());
88:
89: message = sw.getString();
90: }
91: } catch (Throwable e) {
92: e.printStackTrace();
93: }
94:
95: return message;
96: }
97: }
|