KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > armedbear > j > Log


1 /*
2  * Log.java
3  *
4  * Copyright (C) 1998-2003 Peter Graves
5  * $Id: Log.java,v 1.2 2003/06/29 00:19:34 piso Exp $
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20  */

21
22 package org.armedbear.j;
23
24 import java.io.IOException JavaDoc;
25 import java.io.PrintWriter JavaDoc;
26 import java.io.StringWriter JavaDoc;
27 import java.text.SimpleDateFormat JavaDoc;
28 import java.util.Date JavaDoc;
29
30 public final class Log
31 {
32     // Levels.
33
private static final int DEBUG = 1;
34     private static final int INFO = 2;
35     private static final int WARN = 3;
36     private static final int ERROR = 4;
37     private static final int FATAL = 5;
38
39     // Synchronization.
40
private static final Object JavaDoc lock = new Object JavaDoc();
41
42     private static final SimpleDateFormat JavaDoc dateFormat =
43         new SimpleDateFormat JavaDoc("MMM dd HH:mm:ss.SSS ");
44     private static final int lineSeparatorLength =
45         System.getProperty("line.separator").length();
46
47     // Configuration.
48
private static boolean logEnabled;
49     private static long maxFileSize;
50     private static int maxBackupIndex;
51     private static int minLevel;
52
53     private static PrintWriter JavaDoc logWriter;
54     private static long fileSize;
55     private static boolean rollOverEnabled;
56
57     private static final void setRollOverEnabled(boolean b)
58     {
59         rollOverEnabled = b;
60     }
61
62     public static final int getLevel()
63     {
64         return minLevel;
65     }
66
67     public static final void setLevel(int level)
68     {
69         minLevel = level;
70     }
71
72     public static final void debug(String JavaDoc s)
73     {
74         log(DEBUG, s);
75     }
76
77     public static final void debug(Throwable JavaDoc t)
78     {
79         log(DEBUG, t);
80     }
81
82     public static final void info(String JavaDoc s)
83     {
84         log(INFO, s);
85     }
86
87     public static final void warn(String JavaDoc s)
88     {
89         log(WARN, s);
90     }
91
92     public static final void warn(Throwable JavaDoc t)
93     {
94         log(WARN, t);
95     }
96
97     public static final void error(String JavaDoc s)
98     {
99         log(ERROR, s);
100     }
101
102     public static final void error(Throwable JavaDoc t)
103     {
104         log(ERROR, t);
105     }
106
107     public static final void fatal(String JavaDoc s)
108     {
109         log(FATAL, s);
110     }
111
112     private static final void log(int level, String JavaDoc s)
113     {
114         if (Editor.isDebugEnabled())
115             System.err.println(s);
116         if (logEnabled && level >= minLevel)
117             writeLog(level, s);
118     }
119
120     private static final void forceLog(int level, String JavaDoc s)
121     {
122         if (Editor.isDebugEnabled())
123             System.err.println(s);
124         writeLog(level, s);
125     }
126
127     private static final void writeLog(int level, String JavaDoc s)
128     {
129         synchronized(lock) {
130             if (logWriter != null) {
131                 String JavaDoc dt = getDateTimeString();
132                 logWriter.print(dt);
133                 logWriter.print(levelToString(level));
134                 logWriter.println(s);
135                 fileSize += dt.length() + 6 + s.length() + lineSeparatorLength;
136                 if (rollOverEnabled && fileSize > maxFileSize)
137                     rollOver();
138             }
139         }
140     }
141
142     private static final void log(int level, Throwable JavaDoc t)
143     {
144         if (Editor.isDebugEnabled())
145             t.printStackTrace();
146         if (logEnabled && level >= minLevel) {
147             synchronized(lock) {
148                 if (logWriter != null) {
149                     String JavaDoc dt = getDateTimeString();
150                     logWriter.print(dt);
151                     logWriter.print(levelToString(level));
152                     StringWriter JavaDoc sw = new StringWriter JavaDoc();
153                     PrintWriter JavaDoc pw = new PrintWriter JavaDoc(sw);
154                     t.printStackTrace(pw);
155                     String JavaDoc s = sw.toString();
156                     logWriter.println(s);
157                     fileSize += dt.length() + 6 + s.length() + lineSeparatorLength;
158                     if (rollOverEnabled && fileSize > maxFileSize)
159                         rollOver();
160                 }
161             }
162         }
163     }
164
165     // Called only from synchronized methods.
166
private static final void rollOver()
167     {
168         if (!rollOverEnabled)
169             Debug.bug();
170         setRollOverEnabled(false);
171         long start = System.currentTimeMillis();
172         Log.debug("rotating log files...");
173         for (int i = maxBackupIndex-1; i >= 0; i--) {
174             File source = getBackupLogFile(i);
175             File destination = getBackupLogFile(i+1);
176             if (destination.exists())
177                 destination.delete();
178             if (source.isFile())
179                 source.renameTo(destination);
180         }
181         File destination = getBackupLogFile(0);
182         File logFile = getLogFile();
183         logWriter.flush();
184         logWriter.close();
185         if (destination.exists())
186             destination.delete();
187         if (logFile.isFile())
188             logFile.renameTo(destination);
189         logWriter = null;
190         fileSize = 0;
191         try {
192             logWriter = new PrintWriter JavaDoc(logFile.getOutputStream(), true);
193             int oldLevel = getLevel();
194             setLevel(INFO);
195             setRollOverEnabled(false);
196             logSystemInformation();
197             logUptime();
198             setRollOverEnabled(true);
199             setLevel(oldLevel);
200         }
201         catch (IOException JavaDoc e) {
202             logEnabled = false;
203             e.printStackTrace();
204         }
205         long elapsed = System.currentTimeMillis() - start;
206         Log.debug("rollOver " + elapsed + " ms");
207         setRollOverEnabled(true);
208     }
209
210     private static final File getLogFile()
211     {
212         return File.getInstance(Directories.getEditorDirectory(), "log");
213     }
214
215     private static final File getBackupLogFile(int index)
216     {
217         return File.getInstance(Directories.getEditorDirectory(),
218             "log.".concat(String.valueOf(index)));
219     }
220
221     public static final void initialize()
222     {
223         synchronized(lock) {
224             Preferences preferences = Editor.preferences();
225             if (preferences != null) {
226                 preferences.addPreferencesChangeListener(preferencesChangeListener);
227                 loadPreferences();
228                 if (logEnabled) {
229                     initializeLogWriter();
230                     if (logWriter != null) {
231                         setLevel(INFO);
232                         info("Starting j...");
233                         logSystemInformation();
234                         if (Editor.isDebugEnabled())
235                             setLevel(DEBUG);
236                         setRollOverEnabled(true);
237                     }
238                 }
239             }
240         }
241     }
242
243     private static final void initializeLogWriter()
244     {
245         Debug.assertTrue(logWriter == null);
246         File logFile = getLogFile();
247         if (logFile.isFile())
248             fileSize = logFile.length();
249         try {
250             // Append to file, flush automatically.
251
logWriter = new PrintWriter JavaDoc(logFile.getOutputStream(true), true);
252         }
253         catch (Exception JavaDoc e) {
254             logEnabled = false;
255             e.printStackTrace();
256         }
257     }
258
259     private static final void logSystemInformation()
260     {
261         info(Version.getLongVersionString());
262         String JavaDoc snapshotInformation = Version.getSnapshotInformation();
263         if (snapshotInformation != null)
264             info(snapshotInformation);
265         FastStringBuffer sb = new FastStringBuffer("Java ");
266         sb.append(System.getProperty("java.version"));
267         sb.append(' ');
268         sb.append(System.getProperty("java.vendor"));
269         info(sb.toString());
270         String JavaDoc fullversion = System.getProperty("java.fullversion");
271         if (fullversion != null)
272             info(fullversion);
273         String JavaDoc vm = System.getProperty("java.vm.name");
274         if (vm != null)
275             info(vm);
276         sb.setText(System.getProperty("os.name"));
277         sb.append(' ');
278         sb.append(System.getProperty("os.version"));
279         info(sb.toString());
280     }
281
282     private static final void logUptime()
283     {
284         info("up since ".concat(getDateTimeString(Editor.getStartTimeMillis())));
285     }
286
287     private static final String JavaDoc getDateTimeString()
288     {
289         return getDateTimeString(System.currentTimeMillis());
290     }
291
292     private static final String JavaDoc getDateTimeString(long millis)
293     {
294         return dateFormat.format(new Date JavaDoc(millis));
295     }
296
297     // String returned is always 6 characters long and ends with a space.
298
private static final String JavaDoc levelToString(int level)
299     {
300         switch (level) {
301             case DEBUG:
302                 return "DEBUG ";
303             case INFO:
304                 return " INFO ";
305             case WARN:
306                 return " WARN ";
307             case ERROR:
308                 return "ERROR ";
309             case FATAL:
310                 return "FATAL ";
311         }
312         // Shouldn't happen.
313
return "????? ";
314     }
315
316     private static final void loadPreferences()
317     {
318         synchronized(lock) {
319             Preferences preferences = Editor.preferences();
320             logEnabled = preferences.getBooleanProperty(Property.LOG_ENABLED);
321             maxFileSize =
322                 preferences.getIntegerProperty(Property.LOG_MAX_FILE_SIZE);
323             if (maxFileSize < 10000)
324                 maxFileSize = 10000; // Minimum is 10 KB.
325
else if (maxFileSize > 1000000)
326                 maxFileSize = 1000000; // Maximum is 1 MB.
327
maxBackupIndex =
328                 preferences.getIntegerProperty(Property.LOG_MAX_BACKUP_INDEX);
329             if (maxBackupIndex < 0)
330                 maxBackupIndex = 0; // Minimum is one backup.
331
}
332     }
333
334     private static final PreferencesChangeListener preferencesChangeListener =
335         new PreferencesChangeListener() {
336         public void preferencesChanged()
337         {
338             boolean logWasEnabled = logEnabled;
339             loadPreferences();
340             forceLog(DEBUG, "preferencesChanged logEnabled = " + logEnabled);
341             forceLog(DEBUG, "preferencesChanged maxFileSize = " + maxFileSize);
342             forceLog(DEBUG, "preferencesChanged maxBackupIndex = " + maxBackupIndex);
343             if (logEnabled && !logWasEnabled) {
344                 // Start logging.
345
initializeLogWriter();
346                 if (logWriter != null) {
347                     setLevel(INFO);
348                     info("Logging enabled");
349                     logSystemInformation();
350                     logUptime();
351                     if (Editor.isDebugEnabled())
352                         setLevel(DEBUG);
353                     setRollOverEnabled(true);
354                 }
355             } else if (logWasEnabled && !logEnabled) {
356                 // Stop logging.
357
if (logWriter != null) {
358                     forceLog(INFO, "Logging disabled");
359                     logWriter.flush();
360                     logWriter.close();
361                     logWriter = null;
362                 }
363             } else if (logEnabled) {
364                 if (Editor.preferences().getBooleanProperty(Property.DEBUG))
365                     setLevel(DEBUG);
366                 else
367                     setLevel(INFO);
368             }
369         }
370     };
371 }
372
Popular Tags