异步日志记录方法,异步日志记录,import java.
分享于 点击 43030 次 点评:153
异步日志记录方法,异步日志记录,import java.
import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.concurrent.ConcurrentLinkedQueue;public class GameLogs { public final static int insert_item = 0;// public final static int update_item = 1;// public final static int delete_item = 2;// public final static int dummys = 3;// 游戏币 public final static int moneys = 4;// 元宝 public final static int leCurrency = 5;// public final static int pay = 6;// 充值记录 public final static int bannedList = 7;// 加还检查日志 public final static int uplv = 8;// 升级日志 public final static int login_logout = 9;// 登入登出日志 public final static int other = 10; public final static int runScript = 11;// 脚本日志 public final static int mapSkip = 12;// 用户跳转场景 public final static int userState = 13;// 用户状态 public final static int social = 14;// 社交 1好友 2组队 3家族 public final static int transaction = 15 ; // 交易 // 强化成功 // 强化失败 // 交易 // 合成 // 镶嵌 // 打孔 // 卖出 // 购买 // 杀死后获取 // 使用 // 修理 // 丢弃 // 装备 // 卸下 // 存入 // 取出 private static final int act_count = 16; private static String logsPath = Def.APP_ROOT + "/logs/"; private static ConcurrentLinkedQueue<Log>[] logsList = new ConcurrentLinkedQueue[act_count]; static { for (int i = 0; i < act_count; i++) { logsList[i] = new ConcurrentLinkedQueue(); } } private static ConcurrentLinkedQueue<Log> logs = new ConcurrentLinkedQueue<Log>(); /** * 增加业务日志 * * @param a * 业务动作 *@param objects *@date 2009-6-22 *@author eric.chan */ public static void logs(int actCount, Object... objects) { Log log=logs.poll(); if(log==null)log=new Log(objects); else log.setLog(objects); switch (actCount) { case insert_item:// logsList[0].offer(log); break; case update_item:// logsList[1].offer(log); break; case delete_item:// logsList[2].offer(log); break; case dummys:// 游戏币 logsList[dummys].offer(log); break; case moneys:// 元宝 logsList[moneys].offer(log); break; case leCurrency:// logsList[leCurrency].offer(log); break; case pay:// 充值记录 logsList[pay].offer(log); break; case bannedList:// 加检查日志 logsList[bannedList].offer(log); break; case uplv:// 升级日志 logsList[uplv].offer(log); break; case login_logout:// 登录登出日志 logsList[login_logout].offer(log); break; case other:// 其它 logsList[other].offer(log); break; case runScript:// 脚本运行日志 logsList[runScript].offer(log); break; case mapSkip://场景跳转 logsList[mapSkip].offer(log); break; case userState:// 用户状态 logsList[userState].offer(log); break; case social://社交 1好友 2组队 3家族 logsList[social].offer(log); break; case transaction: // 交易 logsList[transaction].offer(log); break; default: throw new NullPointerException("not found actCount" + actCount); } } public static void logFlushThread() { new LogWorker().start(); } public static void flush() { for (int i = 0; i < act_count; i++) { File f = new File(logsPath + DateUtils.getNowDate2() + "/" + i); if (!f.exists()) f.getParentFile().mkdirs(); BufferedWriter bw = null; try { bw = new BufferedWriter(new FileWriter(f, true)); StringBuilder sb = new StringBuilder(); Log obj = null; int t = 0; ConcurrentLinkedQueue<Log> clq = logsList[i]; while ((obj = clq.poll()) != null) { Object[] objs = obj.objs; sb.setLength(0); for (Object o : objs) { sb.append(o).append('@'); } sb.append(obj.date).append('@'); sb.append("\\n"); bw.write(sb.toString()); obj.clear(); logs.offer(obj);// sb = null; t++; if (t % 50 == 0) { bw.flush(); } } bw.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (bw != null) { try { bw.close(); } catch (IOException e) { e.printStackTrace(); } } } } } private static class Log { public Object[] objs; public String date = DateUtils.getNowDate3(); public Log(Object[] o) { objs = o; } public void setLog(Object[] o) { objs = o; date = DateUtils.getNowDate3(); } public void clear(){ date=null; objs=null; } } public static void main(String[] args) { logFlushThread(); for (int i = 0; i < 100000; i++) logs(213123, 123, 14, 234, 312, 412, 31, 4, 23, 123, 12, 3); }}class LogWorker extends Thread { public void run() { while (Config.threadRunFlag) { try { GameLogs.flush(); } catch (Exception e) { e.printStackTrace(); } finally { try { this.sleep(1000 * 60); } catch (InterruptedException e) { e.printStackTrace(); } } } }}//该片段来自于http://byrx.net
用户点评