콘텐츠로 이동

로그인 로그

유저가 로그인할 때 생성하는 로그입니다. 새롭게 출시한 게임에서나, 마케팅을 진행 중인 게임에 유입되는 유저의 현황을 확인할 수 있습니다.

카테고리

  • Scribe 방식
상용 서버 login_log
개발 서버 test_login_log
  • FTP 방식
파일명 규칙 login_[날짜][서버][중복방지용id].json 예. login_20180705_111500_GLOBAL-4.json
  • fluentd 방식 (로그 정의 템플릿)
서버 (2대 로드밸런싱) analytics-hivelog-03.withhive.com analytics-hivelog-04.withhive.com
TAG명 규칙 ha2union.game.[게임명약칭].login_log 예. ha2union.game.samplegame.login_log
category 필드 값 [게임명약칭]_login_log 예. {"category":"samplegame_login_log","aaa":1}
자세한 전송 방법 안내
  • http 방식 (로그 정의 템플릿)
서버 https://analytics-log.withhive.com
category 필드 값 [게임명약칭]_login_log 예. {"category":"samplegame_login_log","aaa":1}
자세한 전송 방법 안내

로그 스펙

Note

스네이크 케이스(예: server_id) 형태의 필드는 최종 저장소(BigQuery)에 저장될 때 카멜 케이스(예: serverId) 형태로 변환되며, serverid 같은 스펙에 명시되지 않은 형태로 전송된 로그는 해당 컬럼에 저장되지 않습니다.

필드명 설명 타입 필수여부
date 로그 발생 시각
형식: 년-월-일 시:분:초. 한국시간 (KST)
예. 2012-01-19 16:24:00
Scribe/FTP 전송 시 필수, Fluentd 전송 시 선택
string N
dateTime 로그 발생 시각
형식: 년-월-일 시:분:초. 한국시간 (KST)
예. 2012-01-19 16:24:00
string Y
category [게임 브랜드명]_[로그명]
게임 브랜드명은 app_id의 세 번째 항목
예. "derbyday_login_log"
string Y
timezone 로그에 입력하는 시간 파라미터 값의 UTC offset 값
  • 기존 scribe/ftp 방식으로 전송할 때 date 값의 기준이 항상 KST이므로 공백 혹은 GMT+09:00로 값을 고정
  • 예. "GMT+09:00"
  • 로그 정의를 fluentd/http 방식으로 전송할 때 dateTime 값에 따라 timezone 값을 동적으로 설정
  • 예. "GMT+10:30"
string Y
channel 로그인 채널
C2S: HIVE
KAK: 카카오
LIN: 라인
WEI: 웨이보
GVL: 게임빌라이브
STE: 스팀
string(3) Y
user_id channel 필드로 설정된 채널에서 사용하는 유저 식별자
C2S: vid
KAK: 앱 센터에서 발급하는 유저 식별자
LIN: 앱 센터에서 발급하는 유저 식별자
WEI: 웨이보
bigint Y
app_id HIVE에서 사용하는 AppID
예. 'com.com2us.derbyday.kakao.freefull.google.global.android.common'
string(200) Y
did HIVE에서 사용하는 단말기 식별자(did) 값
(did가 변경될시에는 변경된 did로 보내줘야함)
bigint Y
level 게임 내 유저 레벨 (캐릭터가 다수면 최고 레벨) int Y
client_ip 클라이언트의 IP, 이 값으로 GeoIP를 이용하여 country값 추출 string(32) Y
server_ip 서버의 IP string(32) N
device_name 유저의 단말기 모델명
예. iPhone, iPad, SM-G935, LGM-G600S
string(32) Y
company 로그의 대상이 되는 게임 제작 회사
예. "C2S": 컴투스, "GVI": 컴투스홀딩스
string(3) Y
server_id 서버 구분 코드
서버코드표 참조하여 '서버 코드 (JSON 입력 코드)'를 입력
string Y
server_uid 게임 서버에서 발급하는 유저 식별자. bigint Y
last_login_date 이전 기준 마지막 로그인 일시
유저가 금일 가입한 신규 유저라면, 본 필드는 유저의 로그인 시간과 동일하게 설정
형식: yyyy-mm-dd hh🇲🇲ss
예. 2017-02-28 14:33:00
string 필수는 아니지만 권장
country client_ip 를 못받아오는 경우 국가값을 직접 입력
HIVE 식별자 정책 참고
예. KR
string(2) N
os_version OS의 버전 정보
예. 9.2.1
string(10) 필수는 아니지만 권장
game_language 소문자 두 자로 구성된 게임 언어
HIVE 식별자 정책 참고
예. ko
varchar 필수는 아니지만 권장
is_emulator 블루스택 등 PC용 에뮬레이터로 접속했으면 1, 아니면 0
PC버전으로 접속 시 2
int 필수는 아니지만 권장
guid 매 로그마다 발생하는 고유 키 값
uuid와 같은 랜덤 문자열 형태를 권장
varchar(64) N

로그 예제

{
"dateTime":"2021-10-11 11:27:15",
"category":"[게임명]_login_log",
"timezone":"UTC+09:00",
"channel":"HIVE",
"user_id":10053833008,
"app_id":"com.com2us.hivesdk.android.google.global.normal",
"did":5102491016,
"level":0,
"client_ip":"172.XX.XXX.XX",
"device_name":"TINNO U319AA",
"company":"C2S",
"server_id":"GLOBAL-2",
"server_uid":256489411,
"last_login_date":"2021-10-10 08:33:11",
"os_version":"11",
"is_emulator":0,
"game_language":"en"
}

수집 DB 테이블 스키마(reduced)

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 방식

<?php
$GLOBALS['THRIFT_ROOT'] = '/dev/scribe-php'; // 해당경로는 절대적인 것이 아님. 환경에 맞게 수정하기 바람.
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) // 함수또한 예제임. 각자에 맞게 수정요함.(단 category는 반드시 ‘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); // log를 전송할 목적지 host(포트고정)
        $transport = new TFramedTransport($socket);
        $protocol = new TBinaryProtocol($transport, FALSE, FALSE);
        $scribe_client = new scribeClient($protocol, $protocol);

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

활용 예시

  • 서버에 쌓이는 로그를 1시간마다 오픈 쿼리로 가지고 와서 실시간 유저 현황을 제공합니다.
  • 신규 출시 게임, 마케팅을 집행한 게임 등 유저 유입 현황을 즉시 확인할 목적으로 활용합니다.

  • HIVE 로그에서는 server_id(서버구분)를 알 수 없으므로 Login_log 테이블을 활용하여 보여줍니다.
  • server_id = 1(한국)/2(일본)/3(중국)/4(글로벌)로 구분되며 게임마다 다릅니다.