文档章节

游戏异步日志记录代码

ChenGuop
 ChenGuop
发布于 2015/09/10 10:35
字数 765
阅读 21
收藏 0

游戏异步日志记录代码

import java.io.BufferedWriter;import java.io.File;import java.io.FileWriter;import java.io.IOException;import java.util.concurrent.ConcurrentLinkedQueue; 
import engine.Config; 
/**
 * 游戏日志记录
 * @author javagg.com
 *
 */public class GameLogs {
 
    /**
     * 产生物品游戏世界产出,放入背包仓库容器.首字段产出途径 怪物掉落=Slay 组队获取=TeamSlay 合成获取=Composition
     * 商店购买=Shop 抽取删除=equipExtractDel
     */
    //合成物品=CompositionAdd 分解获取=FenJieAdd  邮件提取=MailAdd
    public final static int add_item = 0;    // 使用物品(使用 合成 交易 寄卖)背包使用=BagUse 战斗使用=AttackUse 合成使用=CompositionUse
    // 抽取属性项=equipExtract 精炼=equipRefine 锻造=equipstrong
    public final static int use_item = 1;    // 背包丢弃=BagDel 战斗死亡掉落=AttackDel 合成物品=CompositionDel 抽取属性项=equipExtractDel
    // 精炼删除=refinedel 锻造删除=strongdel 邮件删除=maildel
    public final static int del_item = 2;// 删除 丢弃
 
    public final static int moneys = 3;// 银两
    public final static int rmb = 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 runScript = 10;// 脚本日志
    public final static int mapSkip = 11;// 用户跳转场景
    public final static int userState = 12;// 用户状态
 
     
    private static final int act_count = 40;    private static String logsPath = null;    private static ConcurrentLinkedQueue<Log>[] logsList = new ConcurrentLinkedQueue[act_count]; 
    public static void init() {        for (int i = 0; i < act_count; i++) {
            logsList[i] = new ConcurrentLinkedQueue();
        }
        String[] str = Config.getRootPath().split("/");
        str[str.length-1] = "GameLog";
        logsPath = "/";        for (String s : str) {
            logsPath = logsPath + s + "/";
        }
        logsPath = logsPath + "/log_" + Config._serverName + "/";        if(!(new File(logsPath).exists()))
            logsPath = Config.getRootPath() + "/log_" + Config._serverName + "/";
 
        System.out.println("logsPath:" + logsPath);
    } 
    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 add_item:// 
            logsList[0].offer(log);            break;        case use_item:// 
            logsList[1].offer(log);            break;        case del_item:// 
            logsList[2].offer(log);            break;        case moneys:// 银两
            logsList[moneys].offer(log);            break;        case rmb:// 元宝
            logsList[rmb].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 runScript:// 脚本运行日志
            logsList[runScript].offer(log);            break;        case mapSkip:// 场景跳转
            logsList[mapSkip].offer(log);            break;        case userState:// 用户状态
            logsList[userState].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;                    if(objs==null)continue;
                    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 * 30);//30秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


© 著作权归作者所有

共有 人打赏支持
下一篇: Urlrewrite
ChenGuop
粉丝 0
博文 12
码字总数 4349
作品 0
济南
程序员
私信 提问
腾讯互娱开源分布式开发框架 Pebble

作者:韩伟 构建游戏世界的Pebble 愿景:出色的游戏服务器端底层框架 现代游戏项目中,为了让更多的玩家能在一起玩,游戏服务器所需要承载的在线玩家数量越来越多。同时为了让游戏更好玩,越...

腾讯云社区
2017/11/23
0
0
ThinkPHP手动写入日志

在开发环境中,打log是非常必须的,特别是在走前端开发的异步请求,异步请求很多时候打log是比较麻烦的,不是将错误信息返回前端的js用console来输出或者alert或者document.write,除了conso...

issac宝华
2016/12/10
72
0
.NET/.NET Core中更清晰的堆栈跟踪

在基于异常的语言中,堆栈跟踪是用于诊断问题最重要的工具之一。在某些情况下,开发人员能得到的仅为一条简短的错误信息以及堆栈跟踪,尤其是当个人可识别信息(PII)约束限制了日志记录的内...

dotNET跨平台
2018/02/14
0
0
一个简单的 C# 异步日志记录器

本文由码农网 – 小峰原创翻译,转载请看清文末的转载要求,欢迎参与我们的付费投稿计划! Clearcove.Logging是一个非常简单的日志库,旨在通过直接许可条款满足大多数日志记录需求。 介绍 ...

码农网
2018/04/13
0
0
棋牌游戏服务器架构: 总体设计

首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它的一份压力测试报告上指出:一台双核r的INTEL Xeon 2.8CPU加上2G内存和...

棋牌游戏服务器托管
2016/11/01
84
0

没有更多内容

加载失败,请刷新页面

加载更多

总结:线程间频繁切换为什么耗费资源?

因为线程切换的时候,CPU需要将此线程的所有执行状态保存起来,如线程编号,执行到的位置等,然后再去执行其它线程。

浮躁的码农
33分钟前
2
0
PHP版本高于5.5时,curl文件上传必须使用CurlFile对象

坑了我一天,之前@的方法各种上传不成功文件。都怀疑服务端有bug了。

叫我哀木涕
34分钟前
1
0
js算法总结

数列求和 等差数列求和 function sum(a0,d,n){//a0->首项,d->公差,n->项数//(首项+末项)*项数/2return (a1+(a1+d*n))*n/2;} 等比数列求和 function sum(a0,q,n){//a0->首项,q->公......

祖达
59分钟前
2
0
小白?转型?毕业生?外行学习快速入行大数据开发指南

这篇文章中,本文将针对三种不同的、想要进入数据科学领域的人群,给出自己的经验,帮助他们迅速有效入行。 虽然没有适合每个人的万能解决方案,但这三类建议值得想转行的你一看。 第1类:新...

董黎明
今天
2
0
好文 | MySQL 索引B+树原理,以及建索引的几大原则

MySQL事实上使用不同的存储引擎也是有很大区别的,下面猿友们可以了解一下。 一、存储引擎的比较 注:上面提到的B树索引并没有指出是B-Tree和B+Tree索引,但是B-树和B+树的定义是有区别的。 ...

Java爬坑之路
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部