当前位置:   article > 正文

【游戏服务器】游戏服务器中的日志处理方式之一_游戏服日志处理

游戏服日志处理

转载:https://blog.csdn.net/kkgbn/article/details/45012787

在游戏开发的过程中,我们需要记录一些日志,以便以后了解游戏运行的情况,以及根据日志发现并处理游戏中的突发情况。

一,游戏日志可以分为以下几种:

1)系统日志

2)用户操作日志

3)异常日志,即错误日志

系统日志

系统日志一般描述的是服务器日常运行的状态。比如启动是否成功,每天统计一下内存的占用量,CPU的使用量等信息。用于查检服务器运行的健康状况。这对于技术分析来说是非常重要的。如果没有这些信息,一但服务器宕机,我们就两眼一抺黑,不知从何下手了。这部分日志一般产生的文件不大,内容不是太多,可以记录成文本形式,以备查看。如果需要存储到数据库中,或使用工具查看,则需要定义好日志的格式,以方便解析。

用户日志

游戏服务器的核心就是用户的日志。用户日志可以分为几大类:登陆日志;消费日志,收入日志,行为日志,充值日志。

1,登陆日志

主要记录玩家登陆的时间,IP等信息。登陆日志可以用于判断客户端的状态。识别使用软件进行不正常的大规模访问。比如,频繁的登陆断开。这会给服务器造成额外的压力。使正常的玩家受到影响,有时候严重的,不能正常登陆。管理员可以根据这些信息,对此客户端的IP进行封号处理。

2,消费日志

主要记录玩家在游戏中各种货币的消费情况。根据这些信息,可以分析玩家大部分资金的流向,对运营的营销有很大的帮助。还可以根据这些信息,查看服务器系统中是否存在一些刷钱的BUG。因为一个人无限的可以购买一个物品明显是不正常的。根据这些日志,可以很快定位到哪个功能导致了这种情况的发生。

3,收入日志

主要记录玩家在游戏中的货币来源情况。也是游戏系统整个产出的表现。便于数值对整个游戏的产出情况做一个全面的了解。也有助于发现系统的BUG,因为一个人的资金突然比别的玩家高出了很多是不正常的。根据这些日志,可以定位到是哪个功能导致了这种异常的增长。

4行为日志

主要记录玩家的一些操作行为,比如抽卡次数,挑战次数,购买次数等信息。分析玩家在游戏成长过程中的行为。根据这些日志,可以修改游戏的某些小功能,增加用户体验的好感。

5充值日志

主要记录玩家的充值信息。这是非常重要的,如果一个玩家充值,钱扣了,但是钻石没发给人家,是要给人家一个说法的。充值日志可以直接反映出哪些玩家是土豪,清楚游戏收入的来源。

异常日志

主要记录在游戏服务器中程序发生的异常。有些BUG在测试环境中是很难测试到的。记录程序中的异常,可以定位程序中BUG的位置,清楚BUG产生的原因。对游戏服务器的改进提供必要的支持。



游戏日志存储的方式

因为日志的存储是一种IO密集的操作,如果在游戏逻辑中处理不当,会造成游戏逻辑处理缓慢,给玩家的体验带来不好的影响。日前常用的日志存储工具是log4j,主要是把日志存储到文本文件中,关于log4j的使用,我们在另外一篇文章中再详述。今天我们聊聊把日志入库的操作。在日志入库之前,一定要定义好日志的格式,方便解析入库。比如登陆日志,需要记录的信息由:用户id,IP,登陆时间等,可以把这些字段写在一个对象里面,然后用转化为JSON字符串。

一般来说,日志与游戏的实时性关联不大。我们可以把日志的入库操作做一个单独的进程开发。让它运行在另外一台与游戏逻辑服务器分开的物理机器上。这样可以减少对游戏逻辑服务器资源的占用,减轻逻辑服务器的压力。实现的方式也很简单。在游戏逻辑服务器初始化一个队列:


 
 
  1. </pre><pre name= “code” class= “java”> import java.util.concurrent.BlockingQueue;
  2. import java.util.concurrent.LinkedBlockingQueue;
  3. public class LogManager {
  4. // 日志缓存队列
  5. private final static BlockingQueue<String> LOG_QUEUE = new LinkedBlockingQueue<String>();
  6. public static void put(String log) {
  7. try {
  8. LOG_QUEUE.put(log);
  9. } catch (InterruptedException e) {
  10. // TODO Auto-generated catch block
  11. e.printStackTrace();
  12. }
  13. }
  14. public static String get() {
  15. try {
  16. return LOG_QUEUE.take();
  17. } catch (InterruptedException e) {
  18. // TODO Auto-generated catch block
  19. e.printStackTrace();
  20. }
  21. return null;
  22. }
  23. }
  • 1




在服务器启动的时候,启动一个线程,从这个日志缓存队列中取出日志,以Socket的方式发送到日志服务器。日志服务器接收传送过来的日志。因为日志服务器要把日志写入到数据库中,为了访止大规模的写入,导致数据库连接资源消耗完,在日志服务器也建立一个缓存队列,把日志先放到缓存队列中。另外再开启若干个线程连接数据库,并从缓存队列中取出日志数据,写入到日志数据库中。在日志数据库中,日志的表按天存储,也就是一天一个表,由程序自动完成。由于日志的数据量非常庞大,可以把数据库中过时比较长的数据备份并删除,也可以做大数据化处理

 原网页已由QQ浏览器云转码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/643069
推荐阅读
相关标签
  

闽ICP备14008679号