1 /*
2 Copyright (C) 2000 - 2007 Grid Systems, S.A.
3
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License, version 2, as
6 published by the Free Software Foundation.
7
8 This program is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 GNU General Public License for more details.
12
13 You should have received a copy of the GNU General Public License
14 along with this program; if not, write to the Free Software
15 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
17
18 /*
19 * Project: KernelConfigurator
20 * Created on 02-mar-2004
21 *
22 * Copyright (c)2003 Grid Systems
23 */
24 package com.gridsystems.config.app;
25
26 import java.io.PrintWriter;
27 import java.io.StringWriter;
28 import java.text.MessageFormat;
29 import java.util.Date;
30 import java.util.logging.Formatter;
31 import java.util.logging.LogRecord;
32
33 /**
34 * Logging formatter with log4j-like style.
35 *
36 * @author <a href="mailto:rruiz@gridsystems.com">Rodrigo Ruiz Aguayo</a>
37 * @version 1.0
38 */
39 public class PatternFormatter extends Formatter {
40
41 /**
42 * Line separator string. This is the value of the line.separator
43 * property at the moment that the SimpleFormatter was created.
44 */
45 private String lineSeparator = System.getProperty("line.separator");
46
47 /**
48 * The date to format.
49 */
50 protected Date date = new Date();
51
52 /**
53 * The message format arguments.
54 */
55 protected Object[] args = new Object[3];
56
57 /**
58 * The formatter to use.
59 */
60 protected MessageFormat formatter = null;
61
62 /**
63 * The pattern.
64 */
65 protected String pattern;
66
67 /**
68 * if true, the stack trace is dumped.
69 */
70 protected boolean showTrace;
71
72 /**
73 * Creates an instance with a default one line pattern.
74 * <p>
75 * The default pattern is <code>{0,date,dd/MM/yyyy HH:mm:ss} {1} - {2}</code>
76 */
77 public PatternFormatter() {
78 this("{0,date,dd/MM/yyyy HH:mm:ss} {1} - {2}", true);
79 }
80
81 /**
82 * Creates an instance that will use the specified pattern. The pattern will be
83 * used with three arguments:
84 *
85 * <ol>
86 * <li>java.util.Date with the message date and time
87 * <li>String with the message log level
88 * <li>String with the message to log
89 * </ol>
90 *
91 * If the message has an attached exception, its stacktrace will be presented only
92 * if the <code>showTrace</code> flag is set to true.
93 *
94 * @param pattern The pattern to use in this instance
95 * @param showTrace true if we want attached exceptions stack traces to be dumped
96 */
97 public PatternFormatter(String pattern, boolean showTrace) {
98 this.pattern = pattern;
99 this.showTrace = showTrace;
100 }
101
102 /**
103 * {@inheritDoc}
104 */
105 public String format(LogRecord record) {
106 if (formatter == null) {
107 formatter = new MessageFormat(pattern);
108 }
109
110 // Minimize memory allocations here.
111 date.setTime(record.getMillis());
112 args[0] = date;
113 args[1] = record.getLevel().getLocalizedName();
114 args[2] = formatMessage(record);
115
116 StringBuffer text = new StringBuffer();
117 formatter.format(args, text, null);
118
119 text.append(lineSeparator);
120 if (showTrace && record.getThrown() != null) {
121 try {
122 StringWriter sw = new StringWriter();
123 PrintWriter pw = new PrintWriter(sw);
124 record.getThrown().printStackTrace(pw);
125 pw.close();
126 text.append(sw.toString());
127 } catch (Exception ex) { }
128 }
129 return text.toString();
130 }
131 }