This log is stored by user login. You can check the current status of users who join new games or play games due to promotion.
Category
- Scribe type
Common Server service_metrics-login_log Test Server test-login_log - FTP type
Naming Rule login_[Date]_[Server]_[ID for avoiding duplication].json e.g., login_20180705_111500_GLOBAL-4.json - Fluentd type (Based on Log definition)
Server (Balancing loads to two servers) analytics-hivelog-03.withhive.com
analytics-hivelog-04.withhive.comRule for naming tag ha2union.game.[short name of game].login_log e.g., ha2union.game.samplegame.login_log Value of category field [short name of game]_login_log e.g., {“category”:”samplegame_login_log”,”aaa”:1} Detailed transmission method - http type (Based on Log definition)
Server https://analytics-log.withhive.com Value of category field [short name of game]_login_log e.g., {“category”:”samplegame_login_log”,”aaa”:1} Detailed transmission method
Log Specification
Field Name | Description | Type | Required |
date | The time storing log Format: yyyy-mm-dd hh:mm:ss e.g., 2012-01-19 16:24:00 Required for Scribe/FTP type, optional for Fluentd type |
string | N |
dateTime | The time storing log Format: yyyy-mm-dd hh:mm:ss e.g., 2012-01-19 16:24:00 |
string | Y |
category | [The brand name of game]_[Log name]
The brand name of game is the third item of app_id |
string | Y |
timezone | UTC offset of time parameter in the log
|
string | Y |
channel | Login channel C2S: HIVE KAK: Kakao Talk LIN: LINE WEI: Weibo GVL: Gamevile Live STE: Steam |
string(3) | Y |
user_id | User identifier used with the configured channel field C2S: vid KAK: User identifier issued by App Center LIN: User identifier issued by App Center WEI: Weibo |
bigint | Y |
app_id | AppID which HIVE uses e.g., ‘com.com2us.derbyday.kakao.freefull.google.global.android.common’ |
string(200) | Y |
did | Device ID which HIVE uses | bigint | Y |
level | User level in the game (The highest level with numerous character) | int | Y |
client_ip | Client IP. This value extracts the value of country from GeoIP | string(32) | Y |
server_ip | Server IP | string(32) | N |
device_name | User device model e.g., iPhone, iPad, SM-G935, LGM-G600S |
string(32) | Y |
company | Game publishing company, the target of log: e.g., “C2S”: Com2uS, “GVI”: Com2uS Holdings |
string(3) | Y |
server_id | Server Code See Server Code Table to input ‘JSON Input Code’ |
string | Y |
server_uid | User identifier used in game server | bigint | Y |
last_login_date | The last login time yesterday If the user signs up today, set this field as the login time Format: yyyy-mm-dd hh:mm:ss e.g., 2017-02-28 14:33 |
string | Not required, but recommended. |
country | Input the country code directly if client_ip is not given. Reference: HIVE Identifier Policy e.g., KR |
string(2) | N |
os_version | OS version information. e.g., 9.2.1 |
string(10) | Not required, but recommended. |
game_language | Language set in the game. two small letters. Reference: HIVE Identifier Policy e.g., ko |
varchar | Not required, but recommended. |
is_emulator | If connecting with Emulator for PC such as BlueStacks, return 1; unless, return 0
to the PC version, return 2 |
int | Not required, but recommended. |
guid | Unique key generated per log Random format such as uuid is recommended |
varchar(64) | N |
Log Sample
1 2 3 4 5 6 7 8 9 10 11 12 |
{ "date": "2012-11-26 13:32:45", "dateTime": "2012-11-26 13:32:45", "category": "derbyday_login_log", "channel": "KAK", "user_id": "88174577796603776", "app_id": "com.com2us.derbyday.kakao.freefull.google.global.android.common", "client_ip": "203.236.26.252", "server_ip": "112.175.60.138", "level": 28, "guid": "ca4bd34c867f4617a819ae139d8d6670" } |
Collected Database Schema (reduced)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
CREATE TABLE `LOGIN_LOG_20131031` ( `log_id` BIGINT(20) NOT NULL AUTO_INCREMENT, `login_date` DATE NOT NULL, `last_login_date` DATETIME NULL, `app_id` VARCHAR(200) NOT NULL, `channel` VARCHAR(3) NOT NULL, `user_id` BIGINT(20) NOT NULL, `device_name` VARCHAR(128) NOT NULL DEFAULT 'unknown', `level` INT(11) NOT NULL, `country` CHAR(2) NULL DEFAULT NULL, `count` INT(11) NOT NULL, `add_date` DATETIME NOT NULL, `mod_date` DATETIME NOT NULL, `db_date` DATETIME NOT NULL, PRIMARY KEY (`log_id`), UNIQUE INDEX `ix_unique` (`login_date`, `app_id`, `channel`, `user_id`, `device_name`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB |
Scribe Type
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
<span style="font-family: 'courier new', courier, monospace;"><?php $GLOBALS['THRIFT_ROOT'] = '/dev/scribe-php'; // This route is changable. 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 writeLoginLog($app_id, $channel, $user_id) // Function is an example as well. Modify it in accordance with the development environment. (Category, however, should be fixed as ‘login_log’) { $msg['category'] = 'login_log'; $msg['message'] = array(); $msg['message']['date'] = date('Y-m-d H:i:s', time()); $msg['message']['last_login_date'] = date('Y-m-d H:i:s', time()); $msg['message']['app_id'] = $app_id; $msg['message']['channel'] = $channel; $msg['message']['user_id'] = $user_id; $msg['message']['level'] = $level; $msg['message']['client_ip'] = $client_ip; $msg['message']['server_ip'] = $server_ip; $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(); } ?></span> |
How to Use
- Bringing the stacked logs on the server every hour, it provides the state of real-time players by implementing openQuery.
- It helps you check the amount of users right away through new realases or marketing on games.
- HIVE Log does not display server_id (identifying server), so it utilizes the table, Login_log.
- server_id is different depending on games, but it usually divided as follows: 1 (Korea); 2 (Japan); 3 (China); 4 (Global).