跳转至

资产差异日志

  • 资产分为可兑现和不可兑现,以分别发送到指定类别。 例如,Tiny Farm有两个类别;可现金类型(铃铛)和不可现金类型(金币)
  • 从游戏服务器收集资产(现金、游戏货币等)差异日志,旨在分析每个用户的游戏模式,以提供更好的服务。

类别

常见服务器
172.19.1.10
noncash_var_log, cash_var_log
测试服务器
222.112.182.65
test_noncash_var_log, test_cash_var_log

日志规范

Note

蛇形命名的字段,如 server_id,在最终存储(BigQuery)时会转换为驼峰命名,如 serverId,而以未指定形式发送的日志,例如 serverid,不会保存在其列中。

字段名称 描述 类型 必需
date 存储日志的时间,格式:yyyy-mm-dd hh🇲🇲ss
例如:2012-01-19 16:24:00
string Y
channel C2S: HIVE, KAK: Kakao, LIN: LINE, WEI: Weibo string(3) Y
user_id 从客户端发送的Hub uid(在其他渠道中,指每个渠道上使用的user_id) bigint Y
user_seq 游戏服务器使用的用户账户的序列号(PK) bigint N
lang 从客户端发送的语言代码
ISO 639-2(3字节语言代码)
例如:KOR
string(3) Y
game 使用游戏的品牌名称
(例如:derbydays)。
app_id的第三项
例如:com.com2us.littlelegends.kakao.freefull.apple.global.ios.universal
→ littlelegends
string(50) Y
market 市场信息
"TS": SKT Tstore
"OL": KT OllehMarket
"OZ": LGU+ OzStore
"AP": Apple Appstore
"GO": Google Play
"SA": Samsung Apps
"LE": Com2us Lebi
string(2) Y
level 游戏中的用户等级 int Y
action_id 与游戏中唯一游戏货币变化相关的用户操作ID
范围:[1–(2^31−1)] API或协议区分游戏中的操作,因此游戏服务器应定义每个操作的ID
一旦定义,不要更改。需要测试
int Y
action_name 与action_id一对一映射的值。如果action_id不同,则action_name也不同
例如:喂养、收获等。
实际数据是基于action_id堆叠的。
如果更改,元表会自动更新
string(50) Y
item_id 导致资产变化的物品标识符。如果资产变化操作与物品无关,则将此值设置为0。
范围:[1–(2^31−1)] 当操作与物品相关时需要此参数。每个游戏应定义物品ID
一旦定义,不要更改。需要测试
int Y
item_name 与item_id一对一映射的值。
除非item_id为0,否则所有值都应有解释。
当item_id为0时输入0
关于item_id的简要说明
string(50) Y
asset_id 对于可兑现资产/社交媒体积分,将此值设置为1到100,对于不可兑现资产,从101及更高的值开始
一旦定义,不要更改。需要测试
(例如:如果可兑现资产是用户通常在游戏中获得而不是购买的,则从101及更高的数字开始设置)
int Y
asset_name 关于asset_id的简要说明
(例如:铃铛、星星、金球、金币)
string(50) Y
amount_prev 与asset_id相关的资产在资产变化之前的数量 bigint Y
amount_var 与asset_id相关的资产变化数量。
资产减少:负数,资产增加:正数
bigint Y
amount_curr 与asset_id相关的资产在资产变化之后的数量。
amount_curr = amount_prev + amount_var
int Y
amount_free_prev 与asset_id相关的免费资产在资产变化之前的数量
(由于日本资金结算法修正而增加)
bigint Y(于2018年1月18日增加)
amount_free_var 与asset_id相关的免费资产变化数量
资产减少:负数,资产增加:正数(由于日本资金结算法修正而增加)
bigint Y(于2018年1月18日增加)
amount_free_curr 与asset_id相关的免费资产在免费资产变化之后的数量
(由于日本资金结算法修正而增加)
amount_free_curr = amount_free_prev + amount_free_var
int Y(于2018年1月18日增加)
amount_paid_prev 资产变动前支付的资产金额,相关于 asset_id
(因日本资金结算法修正而增加)
bigint Y (于2018年1月18日增加)
amount_paid_var 资产变动相关的支付资产金额
资产减少:负数,资产增加:正数(因日本资金结算法修正而增加)
bigint Y (于2018年1月18日增加)
amount_paid_curr 资产变动后支付的资产金额,相关于 asset_id
(因日本资金结算法修正而增加)
amount_paid_curr = amount_paid_prev + amount_paid_var
int Y (于2018年1月18日增加)
client_ip 客户端IP。此值从GeoIP提取国家值 string(32) Y
country 如果未提供client_ip,请直接输入国家代码
例如:KR
string(2) N
server_ip 服务器IP string(32) Y
company 游戏发行公司,日志的目标:
例如,“C2S”:Com2uS,“GVI”:Com2uS Holdings
string(3) Y
server_id 服务器代码
请参考服务器代码表输入服务器代码(JSON输入代码)
string Y
is_emulator 如果通过PC模拟器(如BlueStacks)连接,返回
1;否则,返回0
对于PC版本,返回2
tinyint(1) 不要求,但建议。
game_language 游戏中的语言,使用两个小写字母
例如:ko
参考:标识符政策
varchar 不要求,但建议。(于2018年1月18日增加)
account_id 服务器中唯一的账户标识符(主键) bigint N (于2018年1月18日增加)
deviceid HIVE上的设备ID。抽象广告标识符的标识符(Android:AdvertisingID;iOS:IDFA) bigint N (于2018年1月18日增加)
guid 每个日志生成的唯一键
推荐使用随机格式,如uuid
varchar(64) N
real_count 用户获得的资产实际数量
例如,当用户一次获得十个资产时,只有一个日志保留,但资产的实际数量是十
int Y (于2019年9月4日增加)

记录者类型

<?php
$GLOBALS['THRIFT_ROOT'] = '/dev/scribe-php'; // The route is an example. Modify it in accordance with the development environment.
include_once $GLOBALS['THRIFT_ROOT'].'/scribe.php';
include_once $GLOBALS['THRIFT_ROOT'].'/transport/TSocket.php';
include_once $GLOBALS['THRIFT_ROOT'].'/transport/TFramedTransport.php';
include_once $GLOBALS['THRIFT_ROOT'].'/protocol/TBinaryProtocol.php';

public function writeCashVarLog(.....params.....) // Function is an example as well. Modify it in accordance with the development environment. (Category, however, should be fixed as ‘cash_var_log’)
{
        $msg['category'] = 'cash_var_log';
        $msg['message'] = array();
        $msg['message']['date'] = date('Y-m-d H:i:s', time());
        $msg['message']['channel'] = $channel;
        $msg['message']['user_id'] = $uid;
        $msg['message']['country'] = $country;
        $msg['message']['lang'] = $lang;
        $msg['message']['game'] = $game;
        $msg['message']['market'] = $market;
        $msg['message']['level'] = $level;
        $msg['message']['action_id'] = $action_id; // Once you define, change is unavailable.
        $msg['message']['action_name'] = $action_name;
        $msg['message']['item_id'] = $item_id; // Once you define, change is unavailable.
        $msg['message']['item_name'] = $item_name;
        $msg['message']['asset_id'] = $asset_id; // Use the value between 1 and 100 for each game.
        $msg['message']['asset_name'] = $asset_name;
        $msg['message']['amount_prev'] = $amount_prev;
        $msg['message']['amount_var'] = $amount_var;
        $msg['message']['amount_curr'] = $amount_curr;
        $msg['message'] = json_encode($msg['message']);

        $entry = new LogEntry($msg);
        $messages = array($entry);
        //var_dump($messages);

        $socket = new TSocket('localhost', 1463, TRUE); // the target host to send logs(fixed port)
        $transport = new TFramedTransport($socket);
        $protocol = new TBinaryProtocol($transport, FALSE, FALSE);
        $scribe_client = new scribeClient($protocol, $protocol);

        $transport->open();
        $scribe_client->Log($messages);
        $transport->close();  
}
public function writeNonCashVarLog(.....params.....) // Function is an example as well. Modify it in accordance with the development environment. (Category, however, should be fixed as ‘noncash_var_log’)
{
        $msg['category'] = 'noncash_var_log';
        $msg['message'] = array();
        $msg['message']['date'] = date('Y-m-d H:i:s', time());
        $msg['message']['channel'] = $channel;
        $msg['message']['user_id'] = $uid;
        $msg['message']['country'] = $country;
        $msg['message']['lang'] = $lang;
        $msg['message']['game'] = $game;
        $msg['message']['market'] = $market;
        $msg['message']['level'] = $level;
        $msg['message']['action_id'] = $action_id; // Once you define, change is unavailable.
        $msg['message']['action_name'] = $action_name;
        $msg['message']['item_id'] = $item_id; // Once you define, change is unavailable.
        $msg['message']['item_name'] = $item_name;
        $msg['message']['asset_id'] = $asset_id; // Use the value between 1 and 100 for each game.
        $msg['message']['asset_name'] = $asset_name;
        $msg['message']['amount_prev'] = $amount_prev;
        $msg['message']['amount_var'] = $amount_var;
        $msg['message']['amount_curr'] = $amount_curr;
        $msg['message'] = json_encode($msg['message']);

        $entry = new LogEntry($msg);
        $messages = array($entry);
        //var_dump($messages);

        $socket = new TSocket('localhost', 1463, TRUE); // the target host to send logs(fixed port)
        $transport = new TFramedTransport($socket);
        $protocol = new TBinaryProtocol($transport, FALSE, FALSE);
        $scribe_client = new scribeClient($protocol, $protocol);

        $transport->open();
        $scribe_client->Log($messages);
        $transport->close();  
}
?>

如何使用

  • 资产差异日志有助于检查资产的物品交付/回收状态,并检查回收率。销售额取决于回收率。
  • 游戏中可区分的物品类型和用户行为显示了物品交付/回收的活跃执行位置。
  • 可以通过各种类型的事件检查额外物品销售或免费资产的详细信息。
  • 在使用日志之前,请确保与游戏项目经理、平台规划团队的负责人和BI规划团队讨论如何区分资产/动作/物品。