Log - changnet/MServer GitHub Wiki
服务器都是后台运行,日志是监测服务器运行状态的必要工具。对于一个游戏服务器,日志还需要统计玩家数据、记录玩家行为。不同的功能对实时性、吞吐量的要求也不一样。
- 记录程序运行信息,比如启动时间、进程id、使用的配置文件等。
- 记录错误。比如脚本crash时的堆栈。实时性要求较高。
游戏中都有统计的需求。比如说注册量、活跃量,还有一些资源的产出、消耗等。这类日志实时性要求不高,但吞吐量要很大。而且这类日志通常需要入库,数据库一般为MySQL,统计后台常用Java或者php来做,都喜欢用这个数据库。但是这类日志准确性要求不高,丢一两条日志不是什么大事。因此,可以调整MySQL的配置,写入为主,不设约束。写入的时候做下缓存,批量写入。
统计日志记录了玩家的绝大部分操作,比如什么时候登录,哪个功能消耗了元宝等。但对于一些不涉及统计的操作,也需要记录。比如玩家删掉了邮件,系统中某个活动开始了...
客服通常收到玩家的提问:
- 打boss掉落了xxx,但背包里没有
- 参与xx活动排名第一,没拿到奖励
- 我的邮件不见了
- 武器的等级降了
日志的作用,就是为上面的问题提供依据。做功能的时候,也要想想哪些功能点需要加上日志。
根据经验,游戏服务器的日志都需要双向输出,即日志同时输出到屏幕和文件,上线后,只输出到文件。使用一些外部工具,比如tee可以实现双向输出,但这里还是自己实现了。
此框架底层不涉及业务逻辑,因此只提供两个宏定义:
- PRINTF 普通打印函数,调试用。调试完请直接去掉代码
- ERROR 错误,会实时输出到对应的错误日志文件,如error
在脚本层,提供几个函数:
-
PLOG、PFLOG 同步打印日志
-
PRINT、PRINTF 异步打印日志,需要等日志线程初始完成后才有效
-
ELOG 同步输出错误日志
-
log_mgr里则提供了数据库、文件日志接口,但具体接口需要根据具体需求实现
服务器都是持续运行的,不可能把日志持续输出到一个文件中。这样文件太大不好查,也无法定期清理无用的日志。那么就要有个存储规则。
-
按日期存储 可以按月、按星期、按天来建文件,不同日期存到对应的文件。但有个问题是出问题时不知道要查哪个文件。比如玩家说他的装备降级了。虽然记录了玩家的装备升级日志,但是你不知道玩家是在哪天操作的,只能多个文件去查了。
-
按起服时间存储 游戏服务器都会定期维护的,把起服到停服这段时间记录的日志放到同一个文件也不会太大。但是本地调试可能会产生很多文件。
建议根据实际情况使用。runtime可以按起服时间存储,因为runtime记录的是服务运行状态,内部人员用的,要查的时间点也往往是起服到停服这段时间。对于比较多的日志,按天比较合适,比如登录日志。而一些操作较少的日志,比如装备升级,一直记录到同一个文件即可,方便查询。