1 2 package org.rpi.log; 3 4 import java.io.BufferedWriter; 5 import java.io.File; 6 import java.io.FileInputStream; 7 import java.io.FileNotFoundException; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.io.Writer; 11 import java.util.zip.ZipEntry; 12 import java.util.zip.ZipOutputStream; 13 14 import org.apache.log4j.Layout; 15 import org.apache.log4j.RollingFileAppender; 16 import org.apache.log4j.helpers.CountingQuietWriter; 17 import org.apache.log4j.helpers.LogLog; 18 19 20 21 public class CustomRollingFileAppender extends RollingFileAppender { 22 23 24 private String mExtension; 25 private String mLogHeader; 26 private int mZipCounter; 27 private boolean mZipEnabled; 28 29 public CustomRollingFileAppender(Layout _pattern, String _file, String _extension, boolean _append) throws FileNotFoundException, IOException { 30 super(_pattern, _file + _extension, _append); 31 mExtension = _extension; 32 mLogHeader = null; 33 } 34 35 36 public void setZipEnabled(boolean _zip) { 37 mZipEnabled = _zip; 38 } 39 40 public boolean isZipEnabled() { 41 return mZipEnabled; 42 } 43 44 public void setHeaderParameter(String _header) { 45 mLogHeader = _header; 46 } 47 48 public void setMaximumFileSize(String _max) { 49 int length = _max.length(); 50 String unit = "MB"; 51 String value = _max; 52 if (length > 2) { 53 unit = _max.substring(length - 2); 54 value = _max.substring(0, length - 2); 55 } 56 if ("kB".equalsIgnoreCase(unit)) 57 setMaximumFileSize(Integer.parseInt(value) * 1024); 58 else if ("MB".equalsIgnoreCase(unit)) 59 setMaximumFileSize(Integer.parseInt(value) * 1024 * 1024); 60 else if ("GB".equalsIgnoreCase(unit)) 61 { 62 long mValue = Integer.parseInt(value); 63 setMaximumFileSize(mValue * 1024 * 1024 * 1024); 64 } 65 else 66 setMaximumFileSize(Integer.parseInt(_max) * 1024 * 1024); 67 } 68 69 public void rollOver() { 70 String zipTargetName = ""; 71 String targetName = ""; 72 String fileRoot = fileName.substring(0, fileName.length() - mExtension.length()); 73 LogLog.debug("Rolling over count=" + ((CountingQuietWriter) qw).getCount()); 74 LogLog.debug("maxBackupIndex=" + maxBackupIndex); 75 if (maxBackupIndex > 0) { 76 File file = new File(fileRoot + '.' + maxBackupIndex + mExtension); 77 if (file.exists()) 78 file.delete(); 79 file = new File(fileRoot + '.' + maxBackupIndex + mExtension + ".zip"); 80 if (file.exists()) 81 file.delete(); 82 File target; 83 if (mZipEnabled) { 84 for (int i = maxBackupIndex - 1; i >= 1; i--) { 85 file = new File(fileRoot + "." + i + mExtension + ".zip"); 86 if (file.exists()) { 87 target = new File(fileRoot + '.' + (i + 1) + mExtension + ".zip"); 88 LogLog.debug("Renaming file " + file + " to " + target); 89 file.renameTo(target); 90 } 91 } 92 93 } else { 94 for (int i = maxBackupIndex - 1; i >= 1; i--) { 95 file = new File(fileRoot + "." + i + mExtension); 96 if (file.exists()) { 97 target = new File(fileRoot + '.' + (i + 1) + mExtension); 98 LogLog.debug("Renaming file " + file + " to " + target); 99 file.renameTo(target); 100 } 101 } 102 103 } 104 zipTargetName = fileRoot + "-" + ++mZipCounter + mExtension; 105 targetName = fileRoot + ".1" + mExtension; 106 target = new File(mZipEnabled ? zipTargetName : targetName); 107 closeWriter(); 108 file = new File(fileRoot + mExtension); 109 LogLog.debug("Renaming file " + file + " to " + target); 110 file.renameTo(target); 111 } 112 try { 113 setFile(fileRoot + mExtension, false, bufferedIO, bufferSize); 114 } catch (IOException e) { 115 LogLog.error("setFile(" + fileRoot + mExtension + ", false) call failed.", e); 116 } 117 if (mZipEnabled) { 118 final String zipName = targetName + ".zip"; 119 final String fileToZip = zipTargetName; 120 (new Thread(new Runnable() { 121 122 public void run() { 123 try { 124 File file = new File(fileToZip); 125 FileInputStream fileIn = new FileInputStream(file); 126 long len = file.length(); 127 byte tab[] = new byte[(int) len]; 128 fileIn.read(tab); 129 fileIn.close(); 130 ZipEntry zipEntry = new ZipEntry(fileToZip); 131 ZipEntry _tmp = zipEntry; 132 zipEntry.setMethod(8); 133 zipEntry.setSize(len); 134 FileOutputStream fileOut = new FileOutputStream(zipName); 135 ZipOutputStream zipOut = new ZipOutputStream(fileOut); 136 zipOut.putNextEntry(zipEntry); 137 zipOut.write(tab, 0, (int) len); 138 zipOut.flush(); 139 zipOut.closeEntry(); 140 zipOut.close(); 141 file.delete(); 142 } catch (FileNotFoundException fe) { 143 LogLog.warn("Error while trying to zip log file " + fileToZip + ": " + fe.getMessage()); 144 } catch (IOException ioe) { 145 LogLog.warn("Error while trying to zip log file " + fileToZip + ": " + ioe.getMessage()); 146 } 147 } 148 149 })).start(); 150 } 151 } 152 153 public void activateOptions(boolean writeHeader) { 154 if (fileName != null) { 155 try { 156 setFile(fileName, fileAppend, bufferedIO, bufferSize, writeHeader); 157 } catch (IOException e) { 158 super.errorHandler.error("setFile(" + fileName + "," + fileAppend + ") call failed.", e, 4); 159 } 160 } else { 161 LogLog.warn("File option not set for appender [" + super.name + "]."); 162 LogLog.warn("Are you using FileAppender instead of ConsoleAppender?"); 163 } 164 } 165 166 167 public synchronized void setFile(String fileName, boolean append, boolean bufferedIO, int bufferSize, boolean writeHeader) throws IOException { 168 LogLog.debug("setFile called: " + fileName + ", " + append); 169 if (bufferedIO) 170 setImmediateFlush(false); 171 reset(); 172 FileOutputStream ostream = null; 173 try { 174 ostream = new FileOutputStream(fileName, append); 175 } catch (FileNotFoundException ex) { 176 String parentName = (new File(fileName)).getParent(); 177 if (parentName != null) { 178 File parentDir = new File(parentName); 179 if (!parentDir.exists() && parentDir.mkdirs()) 180 ostream = new FileOutputStream(fileName, append); 181 else 182 throw ex; 183 } else { 184 throw ex; 185 } 186 } 187 Writer fw = createWriter(ostream); 188 if (bufferedIO) 189 fw = new BufferedWriter(fw, bufferSize); 190 setQWForFiles(fw); 191 this.fileName = fileName; 192 fileAppend = append; 193 this.bufferedIO = bufferedIO; 194 this.bufferSize = bufferSize; 195 if (writeHeader) { 196 writeHeader(); 197 } 198 if (append) { 199 File f = new File(fileName); 200 ((CountingQuietWriter) super.qw).setCount(f.length()); 201 } 202 LogLog.debug("setFile ended"); 203 } 204 205 }