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    }