1 package org.ejbca.appserver.jboss; 2 3 import java.io.File ; 4 import java.io.IOException ; 5 import java.text.SimpleDateFormat ; 6 import java.util.Date ; 7 import java.util.Locale ; 8 import java.util.TimeZone ; 9 10 import org.apache.log4j.FileAppender; 11 import org.apache.log4j.Layout; 12 import org.apache.log4j.helpers.LogLog; 13 import org.apache.log4j.spi.LoggingEvent; 14 15 24 public class ScriptrunningDailyRollingFileAppender extends FileAppender { 25 26 static final int TOP_OF_TROUBLE=-1; 29 static final int TOP_OF_MINUTE = 0; 30 static final int TOP_OF_HOUR = 1; 31 static final int HALF_DAY = 2; 32 static final int TOP_OF_DAY = 3; 33 static final int TOP_OF_WEEK = 4; 34 static final int TOP_OF_MONTH = 5; 35 36 private Thread scriptThread; 37 38 42 private String datePattern = "'.'yyyy-MM-dd"; 43 44 45 private String script; 46 47 57 private String scheduledFilename; 58 59 61 private long nextCheck = System.currentTimeMillis () - 1; 62 63 Date now = new Date (); 64 65 SimpleDateFormat sdf; 66 67 RollingCalendar rc = new RollingCalendar(); 68 69 int checkPeriod = TOP_OF_TROUBLE; 70 71 static final TimeZone gmtTimeZone = TimeZone.getTimeZone("GMT"); 73 74 75 77 public ScriptrunningDailyRollingFileAppender() { 78 } 79 80 86 public ScriptrunningDailyRollingFileAppender (Layout layout, String filename, 87 String datePattern) throws IOException { 88 super(layout, filename, true); 89 this.datePattern = datePattern; 90 activateOptions(); 91 } 92 93 96 public void setFile(final String filename) 97 { 98 org.jboss.logging.appender.FileAppender.Helper.makePath(filename); 99 super.setFile(filename); 100 } 101 102 107 public void setDatePattern(String pattern) { 108 datePattern = pattern; 109 } 110 111 112 public String getDatePattern() { 113 return datePattern; 114 } 115 116 public void activateOptions() { 117 super.activateOptions(); 118 if(datePattern != null && fileName != null) { 119 now.setTime(System.currentTimeMillis()); 120 sdf = new SimpleDateFormat (datePattern); 121 int type = computeCheckPeriod(); 122 printPeriodicity(type); 123 rc.setType(type); 124 File file = new File (fileName); 125 scheduledFilename = fileName+sdf.format(new Date (file.lastModified())); 126 127 } else { 128 LogLog.error("Either File or DatePattern options are not set for appender ["+name+"]."); 129 } 130 if (script == null) { 131 LogLog.error("Script option is not set for appender ["+name+"]."); 132 } 133 } 134 135 void printPeriodicity(int type) { 136 switch(type) { 137 case TOP_OF_MINUTE: 138 LogLog.debug("Appender ["+name+"] to be rolled every minute."); 139 break; 140 case TOP_OF_HOUR: 141 LogLog.debug("Appender ["+name 142 +"] to be rolled on top of every hour."); 143 break; 144 case HALF_DAY: 145 LogLog.debug("Appender ["+name 146 +"] to be rolled at midday and midnight."); 147 break; 148 case TOP_OF_DAY: 149 LogLog.debug("Appender ["+name 150 +"] to be rolled at midnight."); 151 break; 152 case TOP_OF_WEEK: 153 LogLog.debug("Appender ["+name 154 +"] to be rolled at start of week."); 155 break; 156 case TOP_OF_MONTH: 157 LogLog.debug("Appender ["+name 158 +"] to be rolled at start of every month."); 159 break; 160 default: 161 LogLog.warn("Unknown periodicity for appender ["+name+"]."); 162 } 163 } 164 165 166 175 int computeCheckPeriod() { 176 RollingCalendar rollingCalendar = new RollingCalendar(gmtTimeZone, Locale.ENGLISH); 177 Date epoch = new Date (0); 179 if(datePattern != null) { 180 for(int i = TOP_OF_MINUTE; i <= TOP_OF_MONTH; i++) { 181 SimpleDateFormat simpleDateFormat = new SimpleDateFormat (datePattern); 182 simpleDateFormat.setTimeZone(gmtTimeZone); String r0 = simpleDateFormat.format(epoch); 184 rollingCalendar.setType(i); 185 Date next = new Date (rollingCalendar.getNextCheckMillis(epoch)); 186 String r1 = simpleDateFormat.format(next); 187 if(r0 != null && r1 != null && !r0.equals(r1)) { 188 return i; 189 } 190 } 191 } 192 return TOP_OF_TROUBLE; } 194 195 198 void rollOver() throws IOException { 199 200 201 if (datePattern == null) { 202 errorHandler.error("Missing DatePattern option in rollOver()."); 203 return; 204 } 205 206 String datedFilename = fileName+sdf.format(now); 207 if (scheduledFilename.equals(datedFilename)) { 211 return; 212 } 213 214 this.closeFile(); 216 217 File target = new File (scheduledFilename); 218 if (target.exists()) { 219 target.delete(); 220 } 221 222 File file = new File (fileName); 223 boolean result = file.renameTo(target); 224 if(result) { 225 LogLog.debug(fileName +" -> "+ scheduledFilename); 226 } else { 227 LogLog.error("Failed to rename ["+fileName+"] to ["+scheduledFilename+"]."); 228 } 229 230 try { 231 this.setFile(fileName, false, this.bufferedIO, this.bufferSize); 234 } 235 catch(IOException e) { 236 errorHandler.error("setFile("+fileName+", false) call failed."); 237 } 238 if ( (script != null) && (script.length() > 0) ) { 239 if ( (scriptThread != null) && scriptThread.isAlive() ) { 242 System.out.println("Stopping old hanging signerthread"); 243 scriptThread.interrupt(); 244 } 245 scriptThread = new Thread (new ScriptThread(script, scheduledFilename)); 246 scriptThread.start(); 247 } 248 249 scheduledFilename = datedFilename; 250 } 251 252 260 protected void subAppend(LoggingEvent event) { 261 long n = System.currentTimeMillis(); 262 if (n >= nextCheck) { 263 now.setTime(n); 264 nextCheck = rc.getNextCheckMillis(now); 265 try { 266 rollOver(); 267 } 268 catch(IOException ioe) { 269 LogLog.error("rollOver() failed.", ioe); 270 } 271 } 272 super.subAppend(event); 273 } 274 275 public String getScript() { 276 return script; 277 } 278 279 public void setScript(String script) { 280 this.script = script; 281 } 282 283 } 284 285 class ScriptThread implements Runnable { 286 private String script; 287 private String infile; 288 public ScriptThread(String script, String infile) { 289 this.script = script; 290 this.infile = infile; 291 } 292 public void run() { 293 294 try { 295 Runtime rt =Runtime.getRuntime(); 296 String s = script +" "+infile; 297 rt.exec(s); 298 312 } catch (Exception e) { 313 LogLog.error("Exception caught while running script: ", e); 314 e.printStackTrace(); 315 } 316 317 } 318 319 } 320 321 | Popular Tags |