rendered paste bodypackage net.sf.l2j.loglistener;import java.util.ArrayList;import java.util.logging.Logger;import net.sf.l2j.gameserver.ClientScheduler;public class LogServer{ protected static Logger _log = Logger.getLogger(LogServer.class.getName()); public static LogServer _instance = new LogServer(); private LogServer() { _events = new ArrayList<String>(); ClientScheduler.getInstance().scheduleLowAtFixedRate(new flushTask(),10000,30000); } public static LogServer getInstance() { return _instance; } public synchronized void addEvent(String event) { _events.add(event); } private void flushEvents() { ArrayList<String> _tmpEvents = null; try { _log.info("Flushing log events, size: " + _events.size()); // tis should be remved from release, to avoid perf. penalty // lock _events, copy to tmp array, clear & release // then we can run long-running task(like flushing tmp array to disk) synchronized(_events) { _tmpEvents = new ArrayList<String>(_events); _events.clear(); } } catch(Exception e) { _log.warning("Exception while flushing log events: " + e.getStackTrace()); } finally { _log.info("Final size: "+_tmpEvents.size()); for(String event : _tmpEvents) { _log.info("[Flushed event]: "+event); } } } class flushTask implements Runnable { public void run() { flushEvents(); } } protected static ArrayList<String> _events;}