MOONSUN
[UE5] 로그 출력 (FString타입 , 커스텀 로그 카테고리, 로그 매크로) 본문
FString 형식을 가져올 때는 → * 필수로 붙여야 함
1. UE_LOG 로그 출력
콘솔(로그 창)에 메시지를 찍는 함수
UE_LOG(카테고리, 로그레벨, TEXT("내용"))
- 카테고리 → 어떤 종류의 로그인지 (필터용)
- 로그레벨 → 중요도 (Warning, Error 등)
- 내용 → 출력할 메시지
UE_LOG(LogTemp,Warning,TEXT("AMyActor Constructor Called!"));
"임시 카테고리(LogTemp)로 Warning 수준 로그를 찍는다"
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
// UE_LOG(카테고리, 로그레벨, TEXT("내용"));
UE_LOG(LogTemp, Warning, TEXT("AMyActor Constructor Called!"));
UE_LOG(LogTemp, Warning, TEXT("%s"), *GetName()); **// FString 형식 → * 필수로 붙여야 함**
...
}
(참고) FString 출력할 때 주의
언리얼 로그는 C 스타일 문자열(TCHAR)만 받기 때문에 * 붙여야 함
UE_LOG(LogTemp, Warning, TEXT("%s"), *GetName());
- %s → 문자열 출력
- GetName() → FString 반환
- GetName() → FString → TCHAR*로 변환 (필수)
2. 커스텀 로그 카테고리
LogTemp 대신 내가 만든 이름으로 로그를 구분
2-1. 선언 (헤더 파일)
DECLARE_LOG_CATEGORY_EXTERN(MoonLog, Log, All);
"MoonLog라는 로그 카테고리 쓸 거다.”
2-2. 정의 (cpp 파일)
DEFINE_LOG_CATEGORY(MoonLog);
"MoonLog 실제로 생성”
2-3. 사용
UE_LOG(MoonLog, Warning, TEXT("%s"), *GetName());
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h"
**DECLARE_LOG_CATEGORY_EXTERN(MoonLog, Log, All); // 로그 카테고리 선언**
UCLASS()
class UNREALSTUDY_API AMyActor : public AActor
{
GENERATED_BODY()
public:
AMyActor();
...
}
#include "MyActor.h"
**DEFINE_LOG_CATEGORY(MoonLog); // 로그 카테고리 정의**
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
UE_LOG(**MoonLog**, Warning, TEXT("%s"), *GetName()); **// 커스텀 로그 사용**
...
}

3. UE_LOG를 감싼 매크로
UE_LOG를 짧고 편하게 쓰려고 만든 래퍼(wrapper)
3-1. 매크로 정의
#define ABLOG(Verbosity, Format, ...) \\
UE_LOG(LogMyActor, Verbosity, TEXT(Format), ##__VA_ARGS__)
매번 UE_LOG 쓰기 귀찮으니까 ABLOG로 줄임
3-2. 사용
ABLOG(Warning, "AMyActor Constructor Called!");
실제로 내부에서는 아래처럼 동작 하는 것]
UE_LOG(LogMyActor, Warning, TEXT("AMyActor Constructor Called!"));
3-3. 변수 포함
ABLOG(Warning, "Actor Name : %s", *GetName());
그대로 UE_LOG랑 동일하게 사용 가능
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "MyActor.generated.h" // .generatred.h 파일은 항상 가장 마지막 선언
DECLARE_LOG_CATEGORY_EXTERN(LogMyActor, Log, All); // 로그 카테고리
// ABLOG 매크로
#define ABLOG(Verbosity, Format, ...) \\
UE_LOG(LogMyActor, Verbosity, TEXT(Format), ##__VA_ARGS__)
// 화면 출력 매크로
#define ABLOG_S(Format, ...) \\
if (GEngine) \\
{ \\
GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Yellow, \\
FString::Printf(TEXT(Format), ##__VA_ARGS__)); \\
}
AMyActor::AMyActor()
{
PrimaryActorTick.bCanEverTick = true;
// -----------------------------------------------------------------------------------
// 로그
// -----------------------------------------------------------------------------------
// 로그 출력
ABLOG(Warning, "AMyActor Constructor Called!");
// 변수 포함 로그
ABLOG(Warning, "Actor Name : %s", *GetName());
// 화면 출력
ABLOG_S("Hello World");
// 화면 + 값 출력
ABLOG_S("Actor Name : %s", *GetName());
...
}

'UE5' 카테고리의 다른 글
| [UE5] 언리얼 애니메이션 StateMachine 설계와 Jump 구현 (0) | 2026.04.03 |
|---|---|
| [UE5] 언리얼 애니메이션 구조 이해: AnimInstance와 AnimGraph (0) | 2026.04.03 |
| [UE5] 입력 처리 : Enhanced Input (Input Mapping Context / Input Action) (0) | 2026.03.31 |
| [UE5] 입력 처리 : Axis, Action 바인딩 (Legacy 버전) (0) | 2026.03.27 |
| [UE5] C++을 언리얼 오브젝트 클래스로 만드는 규칙 (0) | 2026.03.26 |