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. 保存到文件中¶
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-mongodbloggerCentOS:
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)