1 21 22 package org.armedbear.j; 23 24 import java.io.IOException ; 25 import java.io.PrintWriter ; 26 import java.io.StringWriter ; 27 import java.text.SimpleDateFormat ; 28 import java.util.Date ; 29 30 public final class Log 31 { 32 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 private static final Object lock = new Object (); 41 42 private static final SimpleDateFormat dateFormat = 43 new SimpleDateFormat ("MMM dd HH:mm:ss.SSS "); 44 private static final int lineSeparatorLength = 45 System.getProperty("line.separator").length(); 46 47 private static boolean logEnabled; 49 private static long maxFileSize; 50 private static int maxBackupIndex; 51 private static int minLevel; 52 53 private static PrintWriter 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 s) 73 { 74 log(DEBUG, s); 75 } 76 77 public static final void debug(Throwable t) 78 { 79 log(DEBUG, t); 80 } 81 82 public static final void info(String s) 83 { 84 log(INFO, s); 85 } 86 87 public static final void warn(String s) 88 { 89 log(WARN, s); 90 } 91 92 public static final void warn(Throwable t) 93 { 94 log(WARN, t); 95 } 96 97 public static final void error(String s) 98 { 99 log(ERROR, s); 100 } 101 102 public static final void error(Throwable t) 103 { 104 log(ERROR, t); 105 } 106 107 public static final void fatal(String s) 108 { 109 log(FATAL, s); 110 } 111 112 private static final void log(int level, String 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 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 s) 128 { 129 synchronized(lock) { 130 if (logWriter != null) { 131 String 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 t) 143 { 144 if (Editor.isDebugEnabled()) 145 t.printStackTrace(); 146 if (logEnabled && level >= minLevel) { 147 synchronized(lock) { 148 if (logWriter != null) { 149 String dt = getDateTimeString(); 150 logWriter.print(dt); 151 logWriter.print(levelToString(level)); 152 StringWriter sw = new StringWriter (); 153 PrintWriter pw = new PrintWriter (sw); 154 t.printStackTrace(pw); 155 String 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 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 (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 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 logWriter = new PrintWriter (logFile.getOutputStream(true), true); 252 } 253 catch (Exception e) { 254 logEnabled = false; 255 e.printStackTrace(); 256 } 257 } 258 259 private static final void logSystemInformation() 260 { 261 info(Version.getLongVersionString()); 262 String 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 fullversion = System.getProperty("java.fullversion"); 271 if (fullversion != null) 272 info(fullversion); 273 String 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 getDateTimeString() 288 { 289 return getDateTimeString(System.currentTimeMillis()); 290 } 291 292 private static final String getDateTimeString(long millis) 293 { 294 return dateFormat.format(new Date (millis)); 295 } 296 297 private static final String 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 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; else if (maxFileSize > 1000000) 326 maxFileSize = 1000000; maxBackupIndex = 328 preferences.getIntegerProperty(Property.LOG_MAX_BACKUP_INDEX); 329 if (maxBackupIndex < 0) 330 maxBackupIndex = 0; } 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 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 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 |