001 // Copyright (c) 2001 Hursh Jain (http://www.mollypages.org)
002 // The Molly framework is freely distributable under the terms of an
003 // MIT-style license. For details, see the molly pages web site at:
004 // http://www.mollypages.org/. Use, modify, have fun !
005
006 package fc.io;
007
008 import java.io.*;
009 import java.util.*;
010
011 import fc.util.*;
012
013 /**
014 A default implementation of {@link Log} that provides logging to a
015 PrintStream destination and is intended for sending normal application
016 logs to <code>System.{out, error}</code>
017 <p>
018 Messages written to output destinations depend upon the flushing policy of
019 the output destination. Destinations that use <tt>System.{err,out}</tt>
020 will flush messages after every log method invocation.
021 <p>
022 This class should be sufficient for all logging tasks. However custom
023 loggers that subclass {@link Log} can also be written if really desired.
024
025 @author hursh jain
026 */
027 public class SystemLog extends Log
028 {
029 final PrintStream out;
030
031 //or level names
032 private final static String level_name_sep = " \t";
033
034 /**
035 Creates a new SystemLog with a default destination of <tt>System.err</tt>
036 and a default level of {@link Log#DEFAULT_LEVEL}
037
038 @param name name of this log (any arbitrary string)
039 */
040 public SystemLog(String name)
041 {
042 this(name, System.err, DEFAULT_LEVEL);
043 }
044
045 /**
046 Creates a new SystemLog with the specified destination and a
047 default level of {@link Log#DEFAULT_LEVEL}
048
049 @param name name of this log (any arbitrary string)
050 @param out the output destination
051 */
052 public SystemLog(String name, PrintStream out)
053 {
054 this(name, out, DEFAULT_LEVEL);
055 }
056
057 /**
058 Creates a new SystemLog. The newly created log will automatically add
059 itself to the list of all logs maintained by {@link Log} and a subsequent
060 call to {@link Log#get(String)} with the same name will return this log.
061
062 @param name name of this log (any arbitrary string)
063 @param out the output destination
064 @param loglevel the logging level
065 */
066 public SystemLog(String name, PrintStream out, LogLevel loglevel)
067 {
068 super(name, loglevel);
069 assert out != null;
070 this.out = out;
071 addLog(this);
072 }
073
074 /**
075 Closes the log by flushing the destination PrintStream.
076 <code>close()</code> is <b>not</b> called on the PrintStream
077 since it would make PrintStreams like <code>System.out</code>
078 unusable by other code.
079 */
080 public void close()
081 {
082 out.flush();
083 }
084
085 public void log(LogLevel level, Object str1)
086 {
087 synchronized(out)
088 {
089 if (printLevelName) {
090 out.print(level.desc);
091 out.print(level_name_sep);
092 }
093
094 if (printTimestamp) {
095 out.print(getTS());
096 out.print(" ");
097 }
098
099 out.println(str1);
100 }
101 }
102
103
104 public void log(LogLevel level, Object str1, Object str2)
105 {
106 synchronized(out)
107 {
108 if (printLevelName) {
109 out.print(level.desc);
110 out.print(level_name_sep);
111 }
112
113 if (printTimestamp) {
114 out.print(getTS());
115 out.print(" ");
116 }
117
118 out.print(str1);
119 out.print(" ");
120 out.println(str2);
121 }
122 }
123
124 public void log(LogLevel level, Object str1, Object str2, Object str3)
125 {
126 synchronized(out)
127 {
128 if (printLevelName) {
129 out.print(level.desc);
130 out.print(level_name_sep);
131 }
132
133 if (printTimestamp) {
134 out.print(getTS());
135 out.print(" ");
136 }
137
138 out.print(str1);
139 out.print(" ");
140 out.print(str2);
141 out.println(str3);
142 }
143 }
144
145 public void log(LogLevel level, Object str1, Object str2,
146 Object str3, Object str4)
147 {
148 synchronized(out)
149 {
150 if (printLevelName) {
151 out.print(level.desc);
152 out.print(level_name_sep);
153 }
154
155 if (printTimestamp) {
156 out.print(getTS());
157 out.print(" ");
158 }
159
160 out.print(str1);
161 out.print(" ");
162 out.print(str2);
163 out.print(str3);
164 out.println(str4);
165 }
166 }
167
168 public void log(LogLevel level, Object str1, Object str2,
169 Object str3, Object str4,
170 Object str5)
171 {
172 synchronized(out)
173 {
174 if (printLevelName) {
175 out.print(level.desc);
176 out.print(level_name_sep);
177 }
178
179 if (printTimestamp) {
180 out.print(getTS());
181 out.print(" ");
182 }
183
184 out.print(str1);
185 out.print(" ");
186 out.print(str2);
187 out.print(str3);
188 out.print(str4);
189 out.println(str5);
190 }
191 }
192
193 public void log(LogLevel level, Object str1, Object str2,
194 Object str3, Object str4,
195 Object str5, Object str6)
196 {
197 synchronized(out)
198 {
199 if (printLevelName) {
200 out.print(level.desc);
201 out.print(level_name_sep);
202 }
203
204 if (printTimestamp) {
205 out.print(getTS());
206 out.print(" ");
207 }
208
209 out.print(str1);
210 out.print(" ");
211 out.print(str2);
212 out.print(str3);
213 out.print(str4);
214 out.print(str5);
215 out.println(str6);
216 }
217 }
218
219 public void log(LogLevel level, Object str1, Object str2,
220 Object str3, Object str4,
221 Object str5, Object str6,
222 Object str7)
223 {
224 synchronized(out)
225 {
226 if (printLevelName) {
227 out.print(level.desc);
228 out.print(level_name_sep);
229 }
230
231 if (printTimestamp) {
232 out.print(getTS());
233 out.print(" ");
234 }
235
236 out.print(str1);
237 out.print(" ");
238 out.print(str2);
239 out.print(str3);
240 out.print(str4);
241 out.print(str5);
242 out.print(str6);
243 out.println(str7);
244 }
245 }
246
247 public void log(LogLevel level, Object str1, Object str2,
248 Object str3, Object str4,
249 Object str5, Object str6,
250 Object str7, Object str8)
251 {
252 synchronized(out)
253 {
254 if (printLevelName) {
255 out.print(level.desc);
256 out.print(level_name_sep);
257 }
258
259 if (printTimestamp) {
260 out.print(getTS());
261 out.print(" ");
262 }
263
264 out.print(str1);
265 out.print(" ");
266 out.print(str2);
267 out.print(str3);
268 out.print(str4);
269 out.print(str5);
270 out.print(str6);
271 out.print(str7);
272 out.println(str8);
273 }
274 }
275
276 public void log(LogLevel level, Object str1, Object str2,
277 Object str3, Object str4,
278 Object str5, Object str6,
279 Object str7, Object str8,
280 Object... args)
281 {
282 synchronized(out)
283 {
284 if (printLevelName) {
285 out.print(level.desc);
286 out.print(level_name_sep);
287 }
288
289 if (printTimestamp) {
290 out.print(getTS());
291 out.print(" ");
292 }
293
294 out.print(str1);
295 out.print(" ");
296 out.print(str2);
297 out.print(str3);
298 out.print(str4);
299 out.print(str5);
300 out.print(str6);
301 out.print(str7);
302 out.print(str8);
303
304 final int len = args.length;
305 for (int i = 0; i < len; i++) {
306 out.print(args[i]);
307 }
308
309 out.println();
310 }
311 }
312
313
314 public static void main(String args[]) throws Exception
315 {
316 SystemLog l = new SystemLog("stdout2");
317 l.printTimestamp(true);
318 l.printRelativeTimestamp(true);
319 System.out.println("printing using new log with timestamps=true");
320 l.log(INFO, "abc");
321 l.bug("some debug message -- should not print");
322 l.error("error message");
323 l.warn("warn message ", "hah ", "34324 ", "foo ", "bar ", "baz");
324 l.info("info message: ", "hello", "world");
325 l.setLevel(DEBUG);
326 l.bug("some debug message -- should print");
327
328 l.printRelativeTimestamp(false);
329 System.out.println("sleeping for 2 seconds.....");
330 Thread.currentThread().sleep(2000);
331 System.out.println("setting level to 'inFO'");
332 l.setLevel("inFO");
333 System.out.println("level set to: " + l.currentLevel);
334
335 l.logSystemInfo();
336 System.out.println("setting level to 'inFOO'");
337 l.setLevel("inFOO");
338 System.out.println("level set to: " + l.currentLevel);
339
340 SystemLog stdout = Log.getDefault();
341 System.out.println("printing using Default Log");
342 stdout.log(SystemLog.WARN, "some warning");
343
344 SystemLog l2 = new SystemLog("stdout3");
345 Log.setLevelForAll("std", Log.ERROR);
346 System.out.println("Setting all logs to level: error");
347 System.out.println("l1=" + l);
348 System.out.println("l2=" + l2);
349 }
350 }