欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

异步日志记录方法,异步日志记录,import java.

来源: javaer 分享于  点击 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
相关栏目:

用户点评