- 마지막 업데이트
로그
이해하기
스토브 SDK가 제공하는 로그 기능을 사용하면 게임 내 플레이어의 행동과 주요 이벤트를 수집하고 분석할 수 있어요.
수집된 데이터는 스토브 플랫폼의 분석 시스템으로 전송되며, 게임 운영자는 이를 기반으로 콘텐츠 현황 파악, 이벤트 효과 측정, 이상 지표 감지 등을 수행할 수 있어요.
로그는 모바일(Android/iOS) 과 PC 를 모두 지원하며, 플랫폼에 따라 제공 방식이 다르게 동작해요.
로그 종류
| 종류 | 설명 |
|---|---|
| 표준 이벤트 로그 | 스토브가 사전 정의한 이벤트 스키마. 튜토리얼 완료·레벨업 등 게임 공통 행동 기록 |
| 커스텀 이벤트 로그 | 게임이 자유롭게 정의하는 이벤트. 게임 고유 행동·지표 수집 |
| 이용자 속성 로그 | 레벨·직업·결제 등급 등 플레이어 속성값 설정. 이후 이벤트에 자동 포함되어 세그먼트 분석에 활용 |
로그 설계 시 유의사항
ㆍ 개인 식별 정보(이름·연락처 등)는 로그 파라미터에 포함하지 않아야 해요.
ㆍ 이벤트 이름·파라미터는 기획 문서로 사전 정의를 권장해요. 이벤트 이름을 변경하면 기존 수집 데이터와 불일치가 발생할 수 있어요.
플랫폼별 제공 방식
| 항목 | 모바일 | PC |
|---|---|---|
| SDK | Mobile SDK 2.0.0 이상 | PC SDK (Log 모듈) |
| 지원 플랫폼 | Android (Kotlin/Java), iOS, Unity, Unreal | Native C/C++, Unity, Unreal |
| 초기화 순서 | 이용자 로그인 완료 후 로그 호출 가능 | Base SDK 초기화 → Log SDK 초기화 순서 필수 |
| 전송 방식 | SDK 내부 비동기 처리 후 스토브 로그 수집 서버로 전송 | SDK 내부 비동기 처리 후 스토브 로그 수집 서버로 전송 |
| 오프라인 처리 | 모바일, PC 동일 · 네트워크 불안정 시 내부 큐에 저장 후 복구 시 자동 재전송 (최대 1,000건) | |
로그 사용 전에 초기화가 필요해요
ㆍ 로그 기능은 앱 시작 시 한 번 초기화한 뒤 사용해요. (모바일·PC 공통)
ㆍ PC는 Base SDK 연동·초기화를 먼저 완료해야 Log SDK를 초기화할 수 있어요.
개발하기
모바일 — 외부 식별자 설정 (setExternalId)
STOVE Mobile SDK는 핵심 로그를 플랫폼 내부에서 자동으로 수집해요. 교차 분석 목적으로 외부에서 관리하는 식별자(예: MMP 이용자 ID)를 로그 이벤트에 포함시킬 수 있도록 Log.setExternalId() 인터페이스를 제공해요. (Log v2.8.2 이상) 호출 이후 발생하는 모든 로그에 외부 식별자가 자동으로 첨부돼요.
사전 준비
Auth.initialize()호출 이전에Log.setExternalId()를 호출해 외부 식별자 설정을 마쳐야 해요. 초기화 이후에 호출하면 일부 초기 로그에 식별자가 포함되지 않아요.- 외부 식별자 값은 게임/서비스에서 발급·관리해요. SDK는 별도 검증을 하지 않아요.
- 외부 식별자는 SDK 전역에 세팅되며 프로세스 단위로 유지돼요.
외부 식별자 제한
- 문자열 길이: 최대 64자
- 허용 문자: 영문 대소문자, 숫자, 하이픈(
-), 언더스코어(_) - 공백 및 특수문자 사용 불가
개발 흐름
- 외부 식별자 확보: 게임/서비스에서 발급한 외부 식별자 값을 준비해요. (예: MMP 이용자 ID)
Log.setExternalId(externalId)호출:Auth.initialize()를 호출하기 전에 식별자를 설정해요.- 인증 초기화 진행: 이후
Auth.initialize()부터 일반 인증·로그 흐름을 그대로 진행하면, 발생하는 로그에 외부 식별자가 자동으로 포함돼요.
비동기로 식별자를 받아오는 경우
네트워크 응답이나 비동기 API로 외부 식별자를 받는 구조라면, 응답이 완료된 이후에 Auth.initialize()를 호출하도록 부팅 시퀀스를 조정해야 해요. 그렇지 않으면 응답이 늦은 만큼 초기 로그에 식별자가 누락돼요.
트러블슈팅
| 상황 | 원인 | 해결 방법 |
|---|---|---|
| 일부 초기 로그에 외부 식별자가 빠져 있어요 | Auth.initialize() 호출 이후에 Log.setExternalId()를 호출했어요. 식별자 설정 이전에 발생한 로그에는 외부 식별자가 포함되지 않아요. | Log.setExternalId()를 부팅 시퀀스의 가장 앞단으로 옮기고, 식별자 설정이 끝난 뒤에 Auth.initialize()를 호출하세요. 외부 식별자를 비동기로 받아오는 구조라면 응답을 받은 후에 Auth.initialize()를 호출하도록 흐름을 조정하세요. |
| 외부 식별자가 적용되지 않거나 잘려서 들어가요 | 길이가 64자를 넘었거나, 한글·공백·특수문자가 포함됐어요. | 식별자를 영문 대소문자·숫자·하이픈(-)·언더스코어(_)로만 구성하고 64자 이하로 맞추세요. 발급 단계에서 정규식으로 검증한 뒤 SDK에 전달하세요. |
샘플 코드
string externalId = "external-id-12345";
Log.SetExternalId(externalId);
PC (PCSDK)
사전 준비
- BaseSDK 초기화(
Base_Initialize)가 완료된 후 LogSDK를 초기화(Log_Initialize)해야 로그 전송이 가능해요. BaseSDK 초기화가 끝나기 전에Log_Initialize()를 호출하면 초기화에 실패해요. - 게임 루프에서
Base_RunCallback()이 주기적으로 호출돼야 로그 전송의 결과 콜백이 정상 동작해요. - 정리는
Log_UnInitialize()로 LogSDK를 정리한 뒤Base_UnInitialize()로 BaseSDK를 정리해요. - LogSDK가 제공하는 로그 관련 함수는 전송·버전 조회 2개예요. 각각
Log_Send/Log_GetVersion이에요. 이용자 속성·flush·디버그 모드 등은 모바일 SDK 전용이며, PC에서는 게임 측에서 로그 항목에 직접 포함시켜 전송해요.
개발 흐름
- 초기화: BaseSDK 초기화(
Base_Initialize()) 완료 후 LogSDK를 초기화(Log_Initialize())해야 로그를 전송할 수 있어요. - 로그 전송: 로그 항목 파라미터(
StovePCLogSendParam)에 게임 버전·서버 코드 같은 메타데이터와 추가 데이터(contentsJSON 문자열)를 설정해 로그를 전송해요(Log_Send()). - 결과 처리: 콜백에서 결과 객체로 성공 여부를 검증해요. 실패 시 에러 코드별로 분기 처리해요.
- 정리: 게임 종료 직전에
Log_UnInitialize()로 LogSDK를 정리한 뒤Base_UnInitialize()로 BaseSDK를 정리해요.
PC는 고정 필드와 contents JSON으로 로그를 구성해요
PC의 StovePCLogSendParam은 모바일처럼 이벤트 이름과 키·값 파라미터를 직접 받지 않아요. 식별자(auid, cuid), 마케팅 연동(mktType1/mktId1/mktType2/mktId2), 게임 정보(gameVersion, serverCd, serverCdDet, lvCd, lvCdDet), 로그 매핑(logGroupId) 같은 고정 필드를 제공하고, 그 외 데이터는 contents에 JSON 문자열로 담아 전송해요. 모든 필드는 선택 항목이라 게임 특성에 맞춰 필요한 값만 채우면 돼요. 이용자 속성에 해당하는 값(레벨, 직업, 결제 등급 등)도 게임에서 직접 로그 항목에 포함시켜 전송해요.
트러블슈팅
| 상황 | 원인 | 해결 방법 |
|---|---|---|
게임 시작 직후 첫 로그 전송에서 BASE_NOT_INITIALIZED(16)가 반환돼요 | BaseSDK 초기화가 끝나기 전에 LogSDK API를 호출했어요. LogSDK는 BaseSDK가 제공하는 인증·세션 정보에 의존해요. | Base_Initialize를 호출해 BaseSDK 초기화를 완료한 뒤에 Log_Initialize로 LogSDK를 초기화하고 로그를 전송해야 해요. 게임 부팅 시퀀스에서 BaseSDK → LogSDK 순으로 초기화하면 문제없어요. |
NOT_INITIALIZED(17)가 반환돼요 | LogSDK 초기화(Log_Initialize)가 끝나기 전에 로그 전송을 호출했어요. LogSDK는 BaseSDK 초기화 완료 후 별도로 초기화해야 해요. | Base_Initialize로 BaseSDK 초기화를 완료한 뒤 Log_Initialize로 LogSDK를 초기화하고 로그를 전송해야 해요. |
로그 전송 시 INVALID_LOG_PARAMETER(85)가 반환돼요 | 이벤트 이름·키 명명 규칙(영문/숫자/언더스코어, 길이 제한)을 어겼거나 한글·특수문자가 들어갔어요. 파라미터 키에 공백이 들어가도 같은 오류가 나요. | 이벤트 이름과 키는 [A-Za-z0-9_] 범위로만 작성해야 해요. 파라미터 명을 상수로 관리하면서 정규식으로 자체 검증하면 문제없어요. |
로그가 LOG_SIZE_EXCEEDED(86)로 거부돼요 | 한 이벤트의 파라미터 개수가 너무 많거나, String 값 길이가 제한을 넘었어요. 자유 텍스트(채팅 메시지 등)를 그대로 보내면 자주 발생해요. | 파라미터 수를 핵심 지표 위주로 줄이고, 긴 String은 요약·해시·자르기로 다듬어 전송해야 해요. 한 이벤트에 모든 컨텍스트를 담으려 하지 말고 별도 이벤트로 쪼개면 문제없어요. |
일시적으로 로그 전송이 HTTP_ERROR(22)로 실패해요 | 이용자 네트워크 단절, 프록시 차단, STOVE 서버 일시 장애 등 통신 단계에서 실패가 났어요. | LogSDK는 실패한 로그를 로컬 DB에 백업하고 다음 기회에 자동 재전송해요. 게임 측에서는 이용자 화면을 막지 않고 다음 호출에서 자연스럽게 재시도되도록 두면 문제없어요. |
LOCAL_DB_BACKUP_LOG_FAILED(84)가 반환돼요 | 디스크가 가득 찼거나, 게임 설치 경로에 쓰기 권한이 없는 환경(읽기 전용 폴더, 관리자 권한 누락 등)에서 발생해요. | 로그를 로컬 백업할 수 없는 환경이므로 통신 단절 시 로그가 유실될 수 있어요. 게임 운영팀에 알리고, 다음 빌드부터 사용자 폴더(%APPDATA%) 등 쓰기 가능한 경로로 설치 가이드를 안내해야 해요. |
| 로그를 보냈는데 결과 콜백이 호출되지 않아요 | 게임 메인 루프에서 Base_RunCallback()을 호출하지 않으면 SDK가 결과를 게임에 전달할 시점을 잡지 못해요. | 메인 루프에서 매 프레임 또는 일정 주기로 Base_RunCallback()을 호출해야 해요. 입력 처리와 렌더 사이에 한 번 호출하면 문제없어요. |
샘플 코드
// 기존 C/C++ API (~3.4.x)
#include "LogSDK.h"
using namespace Stove::PCSDK;
using namespace Stove::PCSDK::Base;
using namespace Stove::PCSDK::Log;
// 1) 초기화 (Base_Initialize 완료 이후)
auto initResult = Log_Initialize();
if (!initResult.IsSuccessful())
{
// 초기화 실패 시 로직을 구현해 주세요.
return;
}
// 2) 이벤트 로그 전송
StovePCLogSendParam param;
// 모든 필드는 선택 항목이라 게임 특성에 맞춰 필요한 값만 채워요.
param.SetGameVersion(L"1.0.0");
param.SetServerCd(L"Server01");
param.SetContents(L"{\"level\":42,\"class\":\"warrior\"}");
Log_Send(¶m, [](CallbackResult callbackResult)
{
if (callbackResult.GetResult().IsSuccessful())
{
// 전송 성공 시 로직을 구현해 주세요.
}
else
{
// 실패 시 로직(재시도/로깅 등)을 구현해 주세요.
}
});
// 3) 종료 시 정리
Log_UnInitialize();
// 이후 Base_UnInitialize 호출