package net.sf.l2j.logserver; import java.io.File; import java.io.FileWriter; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import net.sf.l2j.gameserver.ClientScheduler; import net.sf.l2j.gameserver.model.L2PcInstance; public class LogServer extends Thread { private static ArrayList _data; static LogServer _instance; private final int POOL_SIZE = 6000; private final long FLUSH_INTERVAL = 2; public LogServer() { _data = new ArrayList(POOL_SIZE); ClientScheduler.getInstance().scheduleLowAtFixedRate(new flush(),FLUSH_INTERVAL*60*1000L,FLUSH_INTERVAL*60*1000L); start(); } public static LogServer getInstance() { if(_instance == null) _instance = new LogServer(); return _instance; } public void run() { System.out.println("LogServer thread up&running," + "allocated "+POOL_SIZE+" pool entries, flush interval(minutes): "+FLUSH_INTERVAL); while(true) { } } public synchronized void add(int logid, L2PcInstance actor, String data) { synchronized(_data) { LogEntry entry = new LogEntry(logid,actor,data); _data.add(entry); } } private class flush implements Runnable { public void run() { ArrayList tmp = null; System.out.println(">> flushing logs, total records: "+_data.size()); // lock _data array, copy & unlock synchronized(_data) { tmp = new ArrayList(_data); _data.clear(); } System.out.println(">> flushing logs, tmp array records: "+tmp.size()); // now long-running flush task, _data now free, so we should avoid thread locking String date = (new SimpleDateFormat("yy_MM_dd_H")).format(new Date()); new File("log/logd").mkdirs(); File file = new File("log/logd/"+date+"_logd"+".txt"); FileWriter save = null; for(LogEntry entry : tmp) { try { save = new FileWriter(file, true); String out = "["+entry.getTimestamp()+"]:" +entry.getLogId()+"," +entry.getActor()+"," +entry.getTarget()+"," +entry.getData() +"\n"; save.write(out); } catch (Exception e) { System.out.println("Error flushing log data: "+e); e.printStackTrace(); } finally { try { save.close(); } catch (Exception e1) { } } } } } private class LogEntry { private int _logid; private String _actor; private int _target; private String _data; private long timestamp; public LogEntry(int logid, L2PcInstance actor, String data) { _logid = logid; _actor = actor.getName(); _data = data; if(actor.getTarget() != null) _target = actor.getTarget().getObjectId(); timestamp = System.currentTimeMillis(); } public int getLogId() { return _logid; } public int getTarget() { return _target; } public String getActor() { return _actor; } public String getData() { return _data; } public long getTimestamp() { return timestamp; } } } example: //BuyLust.java, after line 241: LogServer.getInstance().add(901,activeChar,item.getItemId()+","+item.getCount()+","+(subTotal + tax)); and u got in logs: [1129997620195]:901,SAYMON,268437320,2509,39,663 [timestamp]:logid,actor,targetid,item,amount,price