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

在游戏开发的过程中,我们需要记录一些日志,以便以后了解游戏运行的情况,以及根据日志发现并处理游戏中的突发情况。
一,游戏日志可以分为以下几种:
1)系统日志
2)用户操作日志
3)异常日志,即错误日志
系统日志
系统日志一般描述的是服务器日常运行的状态。比如启动是否成功,每天统计一下内存的占用量,CPU的使用量等信息。用于查检服务器运行的健康状况。这对于技术分析来说是非常重要的。如果没有这些信息,一但服务器宕机,我们就两眼一抺黑,不知从何下手了。这部分日志一般产生的文件不大,内容不是太多,可以记录成文本形式,以备查看。如果需要存储到数据库中,或使用工具查看,则需要定义好日志的格式,以方便解析。
用户日志
游戏服务器的核心就是用户的日志。用户日志可以分为几大类:登陆日志;消费日志,收入日志,行为日志,充值日志。
1,登陆日志
主要记录玩家登陆的时间,IP等信息。登陆日志可以用于判断客户端的状态。识别使用软件进行不正常的大规模访问。比如,频繁的登陆断开。这会给服务器造成额外的压力。使正常的玩家受到影响,有时候严重的,不能正常登陆。管理员可以根据这些信息,对此客户端的IP进行封号处理。
2,消费日志
主要记录玩家在游戏中各种货币的消费情况。根据这些信息,可以分析玩家大部分资金的流向,对运营的营销有很大的帮助。还可以根据这些信息,查看服务器系统中是否存在一些刷钱的BUG。因为一个人无限的可以购买一个物品明显是不正常的。根据这些日志,可以很快定位到哪个功能导致了这种情况的发生。
3,收入日志
主要记录玩家在游戏中的货币来源情况。也是游戏系统整个产出的表现。便于数值对整个游戏的产出情况做一个全面的了解。也有助于发现系统的BUG,因为一个人的资金突然比别的玩家高出了很多是不正常的。根据这些日志,可以定位到是哪个功能导致了这种异常的增长。
4行为日志
主要记录玩家的一些操作行为,比如抽卡次数,挑战次数,购买次数等信息。分析玩家在游戏成长过程中的行为。根据这些日志,可以修改游戏的某些小功能,增加用户体验的好感。
5充值日志
主要记录玩家的充值信息。这是非常重要的,如果一个玩家充值,钱扣了,但是钻石没发给人家,是要给人家一个说法的。充值日志可以直接反映出哪些玩家是土豪,清楚游戏收入的来源。
异常日志
主要记录在游戏服务器中程序发生的异常。有些BUG在测试环境中是很难测试到的。记录程序中的异常,可以定位程序中BUG的位置,清楚BUG产生的原因。对游戏服务器的改进提供必要的支持。

游戏日志存储的方式
因为日志的存储是一种IO密集的操作,如果在游戏逻辑中处理不当,会造成游戏逻辑处理缓慢,给玩家的体验带来不好的影响。日前常用的日志存储工具是log4j,主要是把日志存储到文本文件中,关于log4j的使用,我们在另外一篇文章中再详述。今天我们聊聊把日志入库的操作。在日志入库之前,一定要定义好日志的格式,方便解析入库。比如登陆日志,需要记录的信息由:用户id,IP,登陆时间等,可以把这些字段写在一个对象里面,然后用转化为JSON字符串。
一般来说,日志与游戏的实时性关联不大。我们可以把日志的入库操作做一个单独的进程开发。让它运行在另外一台与游戏逻辑服务器分开的物理机器上。这样可以减少对游戏逻辑服务器资源的占用,减轻逻辑服务器的压力。实现的方式也很简单。在游戏逻辑服务器初始化一个队列:

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

时间: 2024-10-29 01:14:07

游戏服务器中的日志处理方式之一的相关文章

cocos2dx 游戏开发中常用场景切换方式以及特性

runWithScene(CCScene* scene):启动游戏,并运行scene 场景.这个方法在主程序启动时第一次启动主场景时调用. replaceScene(CCScene* scene):直接使用传入的scene 替换当前场景来切换画面,当前场景将被释放.这是切换场景时 最常用的方法. pushScene(CCScene* scene):在不释放旧场景内存的情况下运行新场景,推进新场景相当于在当前可见的纸上再放一张纸,而之前的纸位置何持不变.适用情况: 1.推进一个经常被用到的场景,例

关于游戏服务器中缓存的设计方案的讨论

(只针对游戏服务器中的热数据)游戏服务器的缓存设计总体大概有三种类型:进程内缓存--如java的ehcahe. 进程内缓存--使用会话session Cache,通过语言的基础类型和基础的集合框架来定制 .分布式缓存-- 如redis ,memcahced. 这三种类型各有个的好处,根据不同的应用场景,可以单独使用,也可以相互结合处理. 通过三方框架来做进程内缓存,和定制session cache,在一定程度上有着快而且高效的显著效果,但是不利于做分布式,使用分布式缓存 在一定程度上会造成IO上

Nginx配置(日志服务器中关于日志的产生)

一:概括 1.需要配置的概括 定义日志格式 日志的分割字段:^A 日志格式:IP地址^A服务器时间^A请求参数 配置location,记录请求日志到本地磁盘 将数据按照给定的日志格式存储到本地磁盘 二:配置 1.进入主目录 2.新建日志目录 3.配置conf/nginx.conf 三:测试 1.上传图片到html 2.启动ndinx sbin/nginx 3.页面登录 日志: 4.再次检测 http://linux-hadoop3.ibeifeng.com/BEIfeng.gif?en=e_l&

游戏服务器生成全局唯一ID的几种方法

在服务器系统开发时,为了适应数据大并发的请求,我们往往需要对数据进行异步存储,特别是在做分布式系统时,这个时候就不能等待插入数据库返回了取自动id了,而是需要在插入数据库之前生成一个全局的唯一id,使用全局的唯一id,在游戏服务器中,全局唯一的id可以用于将来合服方便,不会出现键冲突.也可以将来在业务增长的情况下,实现分库分表,比如某一个用户的物品要放在同一个分片内,而这个分片段可能是根据用户id的范围值来确定的,比如用户id大于1000小于100000的用户在一个分片内.目前常用的有以下几种:

同一世界服务器架构--Erlang游戏服务器

Erlang最大的优点是方便,很多基础功能都已经集成到Erlang语言中.之前用C++写服务器的时候,管理TCP连接很繁琐,需要写一大堆代码来实现.底层的框架需要写很多代码实现,这样既浪费时间,又会有很多BUG.但是用Erlang就方便多了,底层的一切你都不需要考虑,你只需要考虑,服务器的架构以及业务逻辑.从此让你彻底从底层的泥潭中解脱.我从去年年底开始了解学习Erlang,到现在我已经彻底爱上了Erlang.好了,废话不多说,开始详细介绍下我设计的这个服务器架构吧. 首先看下整个架构的布局,如

当我设计游戏服务器时,我在想些什么?(1)

机缘巧合的机会,我有幸能够从头开始设计一个游戏的服务器.中间遇到很多欢声笑语和悲伤泪水,这里分享一下. 我之前所在项目组的游戏服务器架构如下图: 这款游戏是一款MMO的端游,GateWay网关的任务是接受客户端的连接,然后通过分发策略,把玩家丢进GameSvr上去,之后玩家的所有请求都直接发给GameSvr,由GameSvr处理了.当然这里的分发策略跟一般的web服务器是不同的,web服务器一般会做成无状态的服务器,也就是对于客户端来说请求到达哪一个服务器都没有关系,都能够被处理,但是游戏服务器

Redis在游戏开发中的应用

Redis是一个新兴的NoSql数据缓存组件,与memcache类似,但是功能却比memcache多一些.首先,Redis和memcache都是基于内存的,所以读取和写入速度都非常快.但是memcache只支持简单的key-value数据的存储方式,而Redis对key-value ,hash,list,set,SortSet等数据结构有很好的支持.下面就Redis在游戏的开发应用中做一些简单的介绍. IT图书网:http://www.myitbook.cn 一,数据的缓存 在这一点上,redi

普通服务器和游戏服务器工作原理有什么不同?

一般的网站应用程序采用的模式是Request-Response,然后通过tcp和服务器建立一次链接,请求的数据是通过http协议进行重新组装,服务器端和客户端完成一次交互之后,就会释放tcp链接,新的客户端就可以使用服务器端的socket资源.web程序的扩展相对来说比价容易,在行业中,比较常用的方法是硬件负载均衡和添加web服务器. 网络游戏就不一样了,它比较突出的一点是客户端和服务器端要进行比较长时间的连接,几乎是不间断的.游戏服务器的原理是Client主动给Server发送数据,Serve

Linux服务器中限制FTP用户访问方式

FTP(File Transfer Protocol)协议:是一个用于在计算机间上传.下载文件的协议. FTP工作在客户端/服务器端的模式中. FTP服务器持续监听来自远处客户端的FTP需求,在收到远处客户端的需求后,它负责管理登陆及建立连接.建立会话期间,执行FTP客户端发过来的命令.进入FTP服务器可以用匿名或者鉴权两种方式来管理.出于安全考虑,LINUX中的大部分系统,会考虑采用鉴权模式,即进入/访问FTP服务器,必须用用户名或密码的方式. 因为FTP不是一个安全协议,所以必须尽量被限制.