package com.quickserverlab.quickcached; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.quickserver.net.server.QuickServer; /** * * @author Akshathkumar Shetty */ public class StatsReportGenerator { private static final Logger logger = Logger.getLogger(StatsReportGenerator.class.getName()); private static final SimpleDateFormat sdfFile = new SimpleDateFormat("dd"); private static int writeInterval = 1000*60;//1m private static List entriesToLog = new ArrayList(); static { entriesToLog.add("datetime"); entriesToLog.add("curr_connections"); entriesToLog.add("total_connections"); } public static List getEntriesToLog() { return entriesToLog; } public static void start(final QuickServer quickserver) { Thread t = new Thread() { public void run() { logger.info("Started.."); Map stats = new LinkedHashMap(25); while(true) { try { sleep(getWriteInterval()); } catch (InterruptedException ex) { Logger.getLogger(StatsReportGenerator.class.getName()).log( Level.WARNING, "Error", ex); break; } CommandHandler.getStats(quickserver, stats); writeReport(quickserver.getPort(), stats); stats.clear(); } logger.info("Done"); } }; t.setName("StatsReportGenerator-Thread"); t.setDaemon(true); t.start(); } public static void setEntriesToLog(List aEntriesToLog) { entriesToLog = aEntriesToLog; } public static void writeReport(int port, Map stats) { if(stats==null || stats.isEmpty()) return; BufferedWriter out = null; try { File reportDir = new File("./stats/"+port+"/"); if(!reportDir.canRead()) reportDir.mkdirs(); //day files - so max of 31 files only.. should be good for analysis.. saves disk space File reportFile = new File("./stats/"+port+"/"+sdfFile.format(new Date())+".csv"); boolean append = true; if((reportFile.lastModified()+1000*60*60*24*5) < System.currentTimeMillis()) { append = false; } boolean writeheader = false; if(reportFile.canRead()==false) { writeheader = true; } out = new BufferedWriter(new FileWriter(reportFile, append)); Iterator iterator = entriesToLog.iterator(); String key = null; String value = null; if(writeheader) { while(iterator.hasNext()) { key = (String) iterator.next(); if(key==null) continue; out.write(key, 0, key.length()); if(iterator.hasNext()) { out.write(", ", 0, 2); } } out.write("\r\n", 0, 2); writeheader = false; } iterator = entriesToLog.iterator(); while(iterator.hasNext()) { key = (String) iterator.next(); if(key==null) continue; value = (String) stats.get(key); if(value==null) continue; out.write(value, 0, value.length()); if(iterator.hasNext()) { out.write(", ", 0, 2); } } out.write("\r\n", 0, 2); } catch (Exception e) { logger.log(Level.WARNING, "Error writing to report file : " + e, e); } finally { if(out!=null) { try { out.flush(); out.close(); } catch (Exception ee) { logger.warning("Error closing Report file : " + ee); } } } } public static int getWriteInterval() { return writeInterval; } public static void setWriteInterval(int aWriteInterval) { writeInterval = aWriteInterval; } }