어쩌다 보니 매 팀프로젝트마다 로그를 담당하게 되고 있다!(나만 로그를 열심히 찍는가...)
첫 슈터 팀플. 로그 카테고리만 정리 > 패키징할 때 제어가 안돼서 수작업으로 로그를 지웠다.
> 로그가 다 날라가서 나중에 보기 불편하다.
둘 멀티 팀플. 로그 매니저 도입 > 퍼스널로그카테고리 > 코드에서 ON/OFF 등 제어
그리고 이번에 받은 피드백.
매번 코드에서 제어하는건 디버깅에 좋지 않으니 에디터에서 제어하면 좋겠다!
(사실 원랜 지난 팀플꺼 그냥 가져와서 쓰려고 점심시간에 후딱 하려고 했는데 새로 다 고쳐서 생각보다 시간이 걸렸다.)
그래서 이번에는 에디터 콘솔창에서 제어할 수 있도록 했다.
그리고 패키징 시에는 로그를 자동으로 제거한다.
또한 AI의 피드백으로 퍼스널로그카테고리보다 담당 파트 별 카테고리를 추천받아
파트 별 카테고리를 만들었고 개발자는 앞에 [ ] 로 식별 및 콘솔 제어가 가능하다.
📌해당 로그 시스템 가이드
GY Log System Guide
개요
GY Log System은 프로젝트 전용 로그 시스템입니다.
기존 UE_LOG를 직접 사용하는 대신 GY_LOG, GY_WARN, GY_ERROR 매크로를 사용하여:
- 프로젝트 로그 구분
- 개발자별 로그 식별
- 에디터 실시간 로그 ON/OFF
- Shipping Build 자동 로그 제거
를 지원합니다.
기본 사용법
Include
#include "Core/Logging/GYLog.h"
로그 출력
일반 로그
GY_LOG(Game, CYS, "게임 시작");
Warning 로그
GY_WARN(Combat, KHB, "체력 부족");
Error 로그
GY_ERROR(Network, KDY, "RPC 실패");
실제 출력 예시
LogGYGame: [CYS] 게임 시작
LogGYCombat: Warning: [KHB] 체력 부족
LogGYNetwork: Error: [KDY] RPC 실패
로그 카테고리
현재 사용 가능한 카테고리:
Game
Inventory
Quest
Combat
Interaction
AI
User
Player
Network
Infra
개발자 이름
현재 등록된 개발자 태그:
KSH
KHB
KDY
LGS
JCM
CYS
KH
KES
로그 사용 규칙
반드시 GY 로그 사용
❌ 사용 금지
UE_LOG(LogTemp, Warning, TEXT("테스트"));
✅ 사용 권장
GY_LOG(Game, CYS, "테스트");
카테고리 선택 기준
| 게임 흐름 | Game |
| 인벤토리 | Inventory |
| 퀘스트 | Quest |
| 전투 | Combat |
| 상호작용 | Interaction |
| AI | AI |
| 플레이어 | Player |
| 네트워크 | Network |
| 시스템/매니저 | Infra |
로그 제어 방법
GY Log System은 언리얼 Console Variable(CVar)을 사용합니다.
에디터 실행 중 실시간으로 로그를 켜고 끌 수 있습니다.
전체 로그 끄기
콘솔:
gy.log 0
전체 로그 켜기
gy.log 1
특정 개발자 로그 끄기
gy.log.CYS 0
특정 개발자 로그 켜기
gy.log.CYS 1
콘솔 위치
다음 위치에서 입력 가능:
Output Log
~
콘솔
Shipping Build
Shipping Build에서는:
GY_LOG
GY_WARN
GY_ERROR
모든 로그 코드가 자동 제거됩니다.
즉:
- 로그 출력 없음
- 문자열 생성 없음
- 성능 비용 없음
로그 작성 예시
좋은 예시
GY_LOG(Game, CYS,
"Stage Start : %d", StageIndex);
GY_WARN(Network, KHB,
"RPC Timeout");
GY_ERROR(Inventory, KSH,
"Item Data Missing : %s", *ItemID.ToString());
권장 사항
1. 의미 있는 로그 작성
❌
GY_LOG(Game, CYS, "들어옴");
✅
GY_LOG(Game, CYS,
"Boss Phase Changed : %d", Phase);
2. Error 남용 금지
GY_ERROR는 실제 오류 상황에서만 사용합니다.
3. Tick 로그 주의
Tick에서 과도한 로그 출력 금지.
필요 시:
gy.log 0
로 전체 비활성화 후 사용 권장.
#pragma once
#include "CoreMinimal.h"
// =============================
// Categories
// =============================
DECLARE_LOG_CATEGORY_EXTERN(LogGYContent, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogGYCombat, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogGYAI, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogGYUI, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogGYPlayer, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogGYNetwork, Log, All);
DECLARE_LOG_CATEGORY_EXTERN(LogGYGame, Log, All);
// =============================
// Config
// =============================
class GY_API FGYLogConfig
{
public:
static bool IsAllEnabled();
static bool IsDeveloperEnabled(const FString& DeveloperName);
};
// =============================
// Macros
// =============================
#if !UE_BUILD_SHIPPING
#define GY_INTERNAL_LOG(Category, Developer, Verbosity, Format, ...) \
if (FGYLogConfig::IsAllEnabled() && \
FGYLogConfig::IsDeveloperEnabled(TEXT(#Developer))) \
{ \
UE_LOG(LogGY##Category, Verbosity, TEXT("[%s] ") TEXT(Format), \
TEXT(#Developer), ##__VA_ARGS__); \
}
#define GY_LOG(Category, Developer, Format, ...) \
GY_INTERNAL_LOG(Category, Developer, Log, Format, ##__VA_ARGS__)
#define GY_WARN(Category, Developer, Format, ...) \
GY_INTERNAL_LOG(Category, Developer, Warning, Format, ##__VA_ARGS__)
#define GY_ERROR(Category, Developer, Format, ...) \
GY_INTERNAL_LOG(Category, Developer, Error, Format, ##__VA_ARGS__)
#else
#define GY_LOG(Category, Developer, Format, ...)
#define GY_WARN(Category, Developer, Format, ...)
#define GY_ERROR(Category, Developer, Format, ...)
#endif
#include "Logging/GYLogManager.h"
#include "HAL/IConsoleManager.h"
// =============================
// Categories
// =============================
DEFINE_LOG_CATEGORY(LogGYContent);
DEFINE_LOG_CATEGORY(LogGYCombat);
DEFINE_LOG_CATEGORY(LogGYAI);
DEFINE_LOG_CATEGORY(LogGYUI);
DEFINE_LOG_CATEGORY(LogGYPlayer);
DEFINE_LOG_CATEGORY(LogGYNetwork);
DEFINE_LOG_CATEGORY(LogGYGame);
// =============================
// Console Variables
// =============================
static TAutoConsoleVariable<int32> CVarGYLog(
TEXT("gy.log"),
1,
TEXT("Enable/Disable all GY logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_KSH(
TEXT("gy.log.KSH"),
1,
TEXT("Enable/Disable KSH logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_KHB(
TEXT("gy.log.KHB"),
1,
TEXT("Enable/Disable KHB logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_KDY(
TEXT("gy.log.KDY"),
1,
TEXT("Enable/Disable KDY logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_LGS(
TEXT("gy.log.LGS"),
1,
TEXT("Enable/Disable LGS logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_JCM(
TEXT("gy.log.JCM"),
1,
TEXT("Enable/Disable JCM logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_CYS(
TEXT("gy.log.CYS"),
1,
TEXT("Enable/Disable CYS logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_KH(
TEXT("gy.log.KH"),
1,
TEXT("Enable/Disable KH logs")
);
static TAutoConsoleVariable<int32> CVarGYLog_KES(
TEXT("gy.log.KES"),
1,
TEXT("Enable/Disable KES logs")
);
// =============================
// Master Toggle
// =============================
bool FGYLogConfig::IsAllEnabled()
{
return CVarGYLog.GetValueOnGameThread() != 0;
}
// =============================
// Developer Toggle
// =============================
bool FGYLogConfig::IsDeveloperEnabled(const FString& DeveloperName)
{
IConsoleVariable* Var =
IConsoleManager::Get().FindConsoleVariable(
*FString::Printf(TEXT("gy.log.%s"), *DeveloperName)
);
if (!Var)
{
return true;
}
return Var->GetInt() != 0;
}
UE_LOG를 쓰는 거 보다 일단 좋아야 쓰니까 최대한 매크로를 간단하게 하고자 했다.
그리고 카테고리가 LogGame이런식이면 언리얼 엔진 시스템 로그랑 구분이 힘들어서
LogGY를 앞에 붙이는 식으로 했다.
아쉬운 부분은 콘솔 부분에서 개발자명이 하드코딩 되어 있다.
카테고리와 이름만 수정하면 어디든 사용할 수 있습니다.
이 글을 본 모두가 가져다 잘 사용하셨으면 좋겠습니다.✨

'팀프로젝트 > 제목없음.최종플젝' 카테고리의 다른 글
| [TIL] 2026-05-27 | 카메라 볼륨 액터 구현, 블루프린트에서 C++로! (0) | 2026.05.27 |
|---|---|
| [TIL] 2026-05-22 | Gameplay Cue로 카메라 이펙트 제어하기 (0) | 2026.05.22 |
| [TIL] 2026-05-21 | 카메라 이펙트 (0) | 2026.05.21 |
| [TIL] 2026-05-20 | Gameplay tag를 사용한 탑다운 카메라 제어하기 (0) | 2026.05.20 |
| [TIL] 2026-05-15 | 퀘스트 데이터 구조 (0) | 2026.05.15 |