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