32. 游戏运营Part 3: 玩家行为日志

在游戏服务器中保留的日志大体上可分为1)程序调试日志和2)用于为客户提供支援而保留的用户行为日志来考虑。

前者的容量更大,不一定非得保存在DB上,仅在服务器发生问题时找出来查看即可,而后者虽然相对来说容量较小,但须要保存在DB等persistent storage中。 iFun引擎对于Debugging log和玩家activity log两种日志均支持。

本章介绍了玩家activity日志。有关调试日志的内容请参考 编程Part1: 调试日志

32.1. Activity Logger Overview

须要保存为日志的用户行为每个游戏均不相同,所以iFun引擎使用了通过JSON文件记述要保存日志的行为后,为该行为创建Logger函数的方式。现在程序员可以利用相应Logger保存日志。Activity log与程序日志区分开,用单独的MongoDB、JSON文件等管理。

Tip

若游戏在 iFun Deploy 中运行,将收集activity log文件,保存在DB中。

32.2. Activity logger定义文件

在创建名为 funapi_initiator my_project 的项目时,先以 src/my_project_loggers.json 为名创建对logger进行定义的JSON文件。

在该文件中按如下所示结构定义日志。

{
  "LogType1": {
    "Argument1": "Type1"
  },

  "LogType2": {
    "Argument1": "Type1",
    "Argument2": "Type2"
  }
}

例如,可按照如下所示方式进行指定。

{
  "SessionOpened": {
    "session_id": "string",
    "when": "datetime2"
  },
  "SessionClosed": {
    "session_id": "string",
    "when": "datetime2"
  },
  "PlayerLoggedIn": {
    "session_id": "string",
    "account_id": "string",
    "when": "datetime2"
  },
  "PlayerDropItem": {
    "player_name": "string",
    "item_name": "string"
  }
}

32.2.1. Activity Logger的参数type

可作为Type值的有以下几种。

Type

Description

bool

真/假

double

实数型

integer

整数型

string

字符串型

datetime

日期类型 (time_t形式)

datetime2

日期类型 (WallClock::Value形式)

32.3. 自动生成的Logger函数

如上所示进行定义并compile后,将自动生成如下所示Logger函数。

namespace logger {

void SessionOpened(const string &session_id, const WallClock::Value &when);
void SessionClosed(const string &session_id, const WallClock::Value &when);
void PlayerLoggedIn(const string &session_id, const string &account_id, const WallClock::Value &when);
void PlayerDropItem(const string &player_name, const string &item_name);

}  // namespace logger

가령 플레이어가 아이템을 떨굴 때마다 이제 logger:PlayerItemDrop() 을 호출하면 됩니다.

class ActivityLog {

  public void SessionOpened(string arg_session_id, System.DateTime arg_when);
  public void SessionClosed(string arg_session_id, System.DateTime arg_when);
  public void PlayerLoggedIn(string arg_session_id, string arg_account_id, System.DateTime arg_when);
  public void PlayerLoggedIn(string arg_player_name, string arg_item_name);

}

가령 플레이어가 아이템을 떨굴 때마다 이제 ActivityLog.PlayerItemDrop() 을 호출하면 됩니다.

32.3.1. 参数类型和程序语言类型的匹配

Activity logger的各个type通过程序语言进行匹配,如下所示。

Logger type

C++ type

C# type

bool

const bool

bool

double

const double

double

integer

const int64_t

long

string

const string &

string

datetime

time_t

System.DateTime

datetime2

const WallClock::Value &

System.DateTime

32.4. Activity logger的log保存位置

activity log的保存位置在MANIFEST.json中设置。

文件形式、DB形式、Syslog形式等均可。

下面是MANIFEST.json的示例。

"Logging": {
  "activity_log_output": "json://activity_log/test",
  "activity_log_rotation_interval": 60
}

上述示例中,根据activity_log_output值的不同,生成的log位置也不同。允许以下路径。

32.4.1. 通过Standard I/O输出

  • stdout: 通过standard output输出日志。

  • stderr: 通过standard error输出日志。

32.4.2. redirect为其他logger

  • glog: 在Program log生成的glog中共同输出。(具体内容请参考 编程Part1: 调试日志 。)

  • syslog://procname: 通过syslog的INFO level值输出。此时,将使用procname作为program name。该功能仅在Linux中运行。

32.4.3. 保存到文件中

  • file://path/to/filename: 在名为 path/to/日期 的目录下,以 filename.时间 形式创建文件,其中用comma区分各个field,一行一行写。

  • json://path/to/file: 与file时的情况类似,但它通过JSON格式生成,而不是用comma区分的一行行log。

Note

对于文件形式,会在名为log root的特定目录下生成,此时的规则如下所示。

*开发阶段在Build目录下的 activity_log/ 目录下生成。 *Live阶段在 /var/log/funapi/{{ project_name }}/activity_log 下生成。

32.4.4. 保存在DB中

  • mongodb://user:passwd@host:port/database: 在MongoDB的特定database下生成日志。user、 password、port等信息为可选信息。例如,可以是 mongodb://localhost:27017/my_activity_log 等形式。对于Replica set的指定等更具体的URI pattern,请参考 MongoDB CXX Driver的Connection String

    为了将日志保存在MongoDB中,请按如下所示,安装附加包。 MongoDB 서버를 설치하는 방법은 MongoDB 를 참고해주세요.

    • Ubuntu:

      sudo apt-get install libfunapi1-mongodblogger
      
    • CentOS:

      sudo yum install funapi1-mongodblogger
      

    同时,还须在 MANIFEST.json 中添加以下项目。

    "Logging": {
      "activity_log_output": "mongodb://localhost:27017/activity_log",
    },
    "MongoDbBase": {
       "mongodb_logger_enable_ssl": false
    }
    

    Note

    SSL/TLS 연결이 필요한 경우 mongdb_logger_enable_ssl 옵션을 true 로 변경해야 합니다.

32.5. Activity Logger功能设置参数

在MANIFEST.json的 Logging 会话中可指定如下所示设置。

  • activity_log_output: 行为日志保存路径。按以上说明所示,可为以下值。

    • stdout

    • stderr

    • glog

    • syslog://name

    • file://path/to/file

    • json://path/to/file

    • mongodb://user:passwd@host:port

    Note

    Syslog仅在Linux中运行。

  • activity_log_rotation_interval: 对行为日志进行循环(Rotation)的时间间隔,单位为秒。(type=int32, default=60)

  • activity_log_write_schema: 是否在行为日志中输出schema信息(type=bool, default=true)