Unreal Engine 5/C++와 Unreal Engine으로 3D 게임 개발

OutputLog에 로그 출력

iiblueblue 2025. 1. 22. 11:29
⊙ OutputLog에 로그를 찍는 방법을 안다.
⊙ OutputLog에 커스텀 카테고리로 로그를 찍는 방법을 안다.
⊙ 원하는 카테고리만 설정하여 로그를 보는 방법을 안다.
더보기

코드스니펫

 

[Item.h]

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once // : 헤더 파일 중복 컴파일 방지

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"

DECLARE_LOG_CATEGORY_EXTERN(LogSparta, Warning, All);

UCLASS()
class CH3_UNREAL3DGAME_API AItem : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	AItem();

protected:
	USceneComponent* SceneRoot; // Scene Component 
	UStaticMeshComponent* StaticMeshComp; // Static Mesh Component
    
	virtual void BeginPlay() override;
};

 

[Item.cpp]

// Fill out your copyright notice in the Description page of Project Settings.


#include "Item.h"

DEFINE_LOG_CATEGORY(LogSparta);

...

void AItem::BeginPlay()
{
    Super::BeginPlay();

    UE_LOG(LogTemp, Warning, TEXT("My Log!"));
    UE_LOG(LogSparta, Error, TEXT("My Sparta!"));
}

 

 

로그 출력

Unity로 게임 개발할 때도 그랬지만 나는 Visual Studio로 디버그 하는 방법을 잘 알지 못해 거의 모든 디버깅을 로그로 해왔다. 게임 개발 중 특정 함수가 제대로 호출되는지, 변수에 어떤 값이 들어있는지 파악해야할 때 로그 메시지는 큰 도움이 된다. 

로그 출력하기

언리얼에서 로그를 출력하는 것은 매크로인 UE_LOG이다. UE_LOG는 아래와 같이 작성하여 사용하며 3개의 매개변수를 넣어 사용한다. 매개변수는 처음부터 로그 카테고리, 로그 수준, 출력할 메시지를 받는다.

UE_LOG(LogTemp, Warning, TEXT("My Log!"));
로그 카테고리(Log Category) 로그 앞에 표시되는 카테고리를 선택한다.(자체 제작 가능)
* 위 예시는 LogTemp라는 언리얼에서 제공하는 임시 카테고리 사용
로그 수준(Log Level) Display 일반적인 실행 흐름이나 상태 확인 메시지(흰색)
Warning 예상치 못한 동작이나 잠재적인 문제(노란색)
Error 즉시 수정이 필요한 심각한 문제(빨간색)
출력할 메시지 TEXT안에 문자열을 넣어 출력할 메시지를 입력

 


 

로그 확인

이렇게 추가한 로그를 확인하는곳은 언리얼 에디터의 Output Log 창이다. 

 

프로젝트를 시작하면 무수한 로그들이 여기 출력되게 된다. 그러다보면 우리가 보고 싶은 로그가 묻혀 보이지 않는 일이 다반사다. 이 때 사용할 수 있는 것이 바로 카테고리이다.

카테고리를 활용하여 로그 확인

Output Log창 안에서 바로 그 기능을 제공하고 있다. 검색창 오른쪽에 보면 필터를 이용해 원하는 카테고리의 로그만 확인할 수 있다.

 

알아두어야 할 점이 한 가지 있다. 필터에 카테고리 이름이 뜨는 것은 한번이라도 출력된 적이 있는 카테고리라는 뜻이다. 즉, 출력된 적이 없는 카테고리의 이름은 이곳에 뜨지 않는다. 만약 필터에 원하는 카테고리가 나오지 않는다면 아예 출력되지 않은게 아닌지 확인해봐야 한다.

 


 

커스텀 로그 카테고리 만들기

이렇게 편리할 로그 카테고리는 커스텀이 가능하다. 언리얼에서 제공하는 것이 아닌 내가 원하는 대로 직접 로그 카테고리를 만들 수 있는 것이다. 프로젝트 규모가 커질 수록 LogTemp 하나만으로는 구분이 어려워지는데 이 때 활용하면 좋을 기능이다.

고유 카테고리 정의하기

고유 카테고리를 추가하기 위해서는 헤더 파일과 cpp 파일 모두 건드려야 한다.

 

먼저 h 파일에 고유 카테고리를 선언하자. 선언부의 앞에서 DECLARE_LOG_CATEGORY_EXTERN이라는 함수를 사용하여 카테고리를 선언할 수 있다. 

#pragma once // : 헤더 파일 중복 컴파일 방지

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Item.generated.h"

DECLARE_LOG_CATEGORY_EXTERN(LogSparta, Warning, All);

UCLASS()
class CH3_UNREAL3DGAME_API AItem : public AActor
{
...

세 개의 매개변수를 가지며 각각 매개변수에 들어가야하는 정보는 아래와 같다.

LogSparta 카테고리 이름(사용자가 지정)
Warning 이 카테고리를 사용할 때 기본적으로 Warning 이상의 로그만 출력하도록 설정
All 필요하면 나중에 모든 로그를 활성화할 수 있도록 허용

 

다음으로 cpp 파일에서 선언한 로그 카테고리를 구현(정의) 해야 한다.

#include "Item.h"

DEFINE_LOG_CATEGORY(LogSparta);

...

void AItem::BeginPlay()
{
...

DEFINE_LOG_CATEGORY(LogSparta)는 괄호 안에 들어있는 카테고리명의 로그 카테고리를 구현(정의)한다. 이제 LogSparta라는 카테고리를 통해 로그 메시지를 출력할 수 있게 되었다.

 

만약 이 카테고리를 다른 코드에서도 사용하고 싶다면 Item.h를 포함해야 한다. 그래서 보통 로그에 관련된 헤더를 따로 만들어 정의하고 공용으로 사용하는 경우가 많다.

 

고유 카테고리 사용하기

그냥 로그를 사용할 때랑 똑같이 사용하면 된다. UE_LOG의 첫 번재 매개변수에 새로 정의한 카테고리의 이름을 적으면 사용할 수 있다.

void AItem::BeginPlay()
{
    Super::BeginPlay();

    UE_LOG(LogTemp, Warning, TEXT("My Log!"));
    UE_LOG(LogSparta, Error, TEXT("My Sparta!"));
}

그러면 아래와 같은 결과를 Output Log에서 볼 수 있다.

 


 

배운 내용 정리

  • 로그는 UE_LOG 매크로를 이용하여 출력할 수 있다.
  • 로그는 개발자가 고유한 로그 카테고리를 만들어 사용할 수 있다.
  • 로그는 Output Log 창에서 확인 가능하며 필터를 이용해 원하는 카테고리만 확인도 가능하다.