在游戏开发的过程当中,咱们须要记录一些日志,以便之后了解游戏运行的状况,以及根据日志发现并处理游戏中的突发状况。
一,游戏日志能够分为如下几种:
1)系统日志
2)用户操做日志
3)异常日志,即错误日志
系统日志
系统日志通常描述的是服务器平常运行的状态。好比启动是否成功,天天统计一下内存的占用量,CPU的使用量等信息。用于查检服务器运行的健康情况。这对于技术分析来讲是很是重要的。若是没有这些信息,一但服务器宕机,咱们就两眼一抺黑,不知从何下手了。这部分日志通常产生的文件不大,内容不是太多,能够记录成文本形式,以备查看。若是须要存储到数据库中,或使用工具查看,则须要定义好日志的格式,以方便解析。
用户日志
游戏服务器的核心就是用户的日志。用户日志能够分为几大类:登录日志;消费日志,收入日志,行为日志,充值日志。
1,登录日志
主要记录玩家登录的时间,IP等信息。登录日志能够用于判断客户端的状态。识别使用软件进行不正常的大规模访问。好比,频繁的登录断开。这会给服务器形成额外的压力。使正常的玩家受到影响,有时候严重的,不能正常登录。管理员能够根据这些信息,对此客户端的IP进行封号处理。
2,消费日志
主要记录玩家在游戏中各类货币的消费状况。根据这些信息,能够分析玩家大部分资金的流向,对运营的营销有很大的帮助。还能够根据这些信息,查看服务器系统中是否存在一些刷钱的BUG。由于一我的无限的能够购买一个物品明显是不正常的。根据这些日志,能够很快定位到哪一个功能致使了这种状况的发生。
3,收入日志
主要记录玩家在游戏中的货币来源状况。也是游戏系统整个产出的表现。便于数值对整个游戏的产出状况作一个全面的了解。也有助于发现系统的BUG,由于一我的的资金忽然比别的玩家高出了不少是不正常的。根据这些日志,能够定位到是哪一个功能致使了这种异常的增加。
4行为日志
主要记录玩家的一些操做行为,好比抽卡次数,挑战次数,购买次数等信息。分析玩家在游戏成长过程当中的行为。根据这些日志,能够修改游戏的某些小功能,增长用户体验的好感。
5充值日志
主要记录玩家的充值信息。这是很是重要的,若是一个玩家充值,钱扣了,可是钻石没发给人家,是要给人家一个说法的。充值日志能够直接反映出哪些玩家是土豪,清楚游戏收入的来源。
异常日志
主要记录在游戏服务器中程序发生的异常。有些BUG在测试环境中是很难测试到的。记录程序中的异常,能够定位程序中BUG的位置,清楚BUG产生的缘由。对游戏服务器的改进提供必要的支持。
二
游戏日志存储的方式
由于日志的存储是一种IO密集的操做,若是在游戏逻辑中处理不当,会形成游戏逻辑处理缓慢,给玩家的体验带来很差的影响。日前经常使用的日志存储工具是log4j,主要是把日志存储到文本文件中,关于log4j的使用,咱们在另一篇文章中再详述。今天咱们聊聊把日志入库的操做。在日志入库以前,必定要定义好日志的格式,方便解析入库。好比登录日志,须要记录的信息由:用户id,IP,登录时间等,能够把这些字段写在一个对象里面,而后用转化为JSON字符串。
通常来讲,日志与游戏的实时性关联不大。咱们能够把日志的入库操做作一个单独的进程开发。让它运行在另一台与游戏逻辑服务器分开的物理机器上。这样能够减小对游戏逻辑服务器资源的占用,减轻逻辑服务器的压力。实现的方式也很简单。在游戏逻辑服务器初始化一个队列:
java
</pre><pre name="code" class="java">import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; public class LogManager { // 日志缓存队列 private final static BlockingQueue<String> LOG_QUEUE = new LinkedBlockingQueue<String>(); public static void put(String log) { try { LOG_QUEUE.put(log); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static String get() { try { return LOG_QUEUE.take(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } }
在服务器启动的时候,启动一个线程,从这个日志缓存队列中取出日志,以Socket的方式发送到日志服务器。日志服务器接收传送过来的日志。由于日志服务器要把日志写入到数据库中,为了访止大规模的写入,致使数据库链接资源消耗完,在日志服务器也创建一个缓存队列,把日志先放到缓存队列中。另外再开启若干个线程链接数据库,并从缓存队列中取出日志数据,写入到日志数据库中。在日志数据库中,日志的表按天存储,也就是一天一个表,由程序自动完成。因为日志的数据量很是庞大,能够把数据库中过期比较长的数据备份并删除,也能够作大数据化处理数据库