관리 메뉴

기억을 위한 기록들

[UE4-CPP] 커스텀 로그(LOG) 만들기 본문

UnrealEngine/UE4 - CPP

[UE4-CPP] 커스텀 로그(LOG) 만들기

에드윈H 2021. 5. 7. 16:32

프로젝트명.h과 프로젝트명.CPP 에 커스텀 로그 카테고리를 설정

#pragma once

#include "CoreMinimal.h"


DECLARE_LOG_CATEGORY_EXTERN(BLOG_LOG, Log, All); //추가

 

 

#include "blogCPP.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, blogCPP, "blogCPP" );
 
DEFINE_LOG_CATEGORY(BLOG_LOG); //추가

 

프로젝트명.h 에 한개씩 추가.

 

1. 호출된 함수의 이름과 라인 매크로를 String화(Call Info) 시켜주는 매크로

#define LOG_CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))

LOG_CALLINFO(이하 콜정보)를 호출해주면 함수이름을 알수 있게 된다.

해당 콜 정보를 UE_LOG에서 string호출로 출력해보게 되면,

로그카테고리명: 클래스명::함수이름(호출된 라인수)

출력이 된다. 하지만 이렇게 사용하기엔 조금 아쉽다. 콜 정보를 좀 더 쉽게 호출해보자.

 

2. Call Info를 쉽게 호출해주는 로그만들기

#define LOG_S(Verbosity) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s"), *LOG_CALLINFO)

해당 LOG_S를 호출하게되면,  로그 카테고리를 안써도되고, 로그 수준만 작성해주면 되어 간단하게 호출할수 있게 된다.

//이전 UELOG는 주석처리

Warning을 넣어 노란색으로 출력되었다. 

 

 

3. Call Info를 쉽게 호출해주는 로그에 원하는 텍스트 넣기

#define LOG(Verbosity, Format, ...) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))

원하는 Text도 출력되는것을 확인하였다.

 

 

그 외

4. Verbosity 인자 제외 후 매크로 화 시키기

#define LOG_WARNING(Format, ...) UE_LOG(BLOG_LOG, Warning, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
#define LOG_ERROR(Format, ...) UE_LOG(BLOG_LOG, Error, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))

 

5. 기존 C/C++에서 Assert와 비슷한 용도 CHECK만들기

#define CHECK(Expr, ...) {if(!(Expr)) {LOG(Error, TEXT("ASSERTION : %s"), TEXT("'"#Expr"'")); return __VA_ARGS__;}}

tempbool이 true라면 아무런 출력도 발생하지 않지만, false라서 해당 tempbool에 대한 어설션로그를 찍어준다.

 

6. 출력로그 말고 게임스크린 간단하게에 찍기

#define	LOG_SCREEN(Format, ...) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(Format, ##__VA_ARGS__))

 

 

요약

프로젝트.h

#pragma once
#include "CoreMinimal.h"

/*아래 전부 추가*/
DECLARE_LOG_CATEGORY_EXTERN(BLOG_LOG, Log, All);

//1. 호출된 함수의 이름과 라인 매크로를 String화 시킴
#define LOG_CALLINFO (FString(__FUNCTION__) + TEXT("(") + FString::FromInt(__LINE__) + TEXT(")"))

//2. 1번 CallInfo와 함께 아무 내용이 없는 로그를 찍는 매크로
#define LOG_S(Verbosity) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s"), *LOG_CALLINFO)

//3. CallInfo와 함께 텍스트로 로그를 찍는 매크로
#define LOG(Verbosity, Format, ...) UE_LOG(BLOG_LOG, Verbosity, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))

//4. LOG에 Verbosity를 인자에서 빼고 매크로화 시킨것. 
#define LOG_WARNING(Format, ...) UE_LOG(BLOG_LOG, Warning, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))
#define LOG_ERROR(Format, ...) UE_LOG(BLOG_LOG, Error, TEXT("%s %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))

//5. assert()와 거의 비슷한 용도로 사용가능한 매크로
#define CHECK(Expr, ...) {if(!(Expr)) {LOG(Error, TEXT("ASSERTION : %s"), TEXT("'"#Expr"'")); return __VA_ARGS__;}}

//6. 게임 플레이 스크린에다가 LOG를 직접 찍는 매크로
#define	LOG_SCREEN(Format, ...) GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, FString::Printf(Format, ##__VA_ARGS__))

프로젝트.cpp

#include "blogCPP.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_PRIMARY_GAME_MODULE( FDefaultGameModuleImpl, blogCPP, "blogCPP" );
 
DEFINE_LOG_CATEGORY(BLOG_LOG); //추가

 

 

설명하면서 하다보니 이것저것 있는데 주로 많이 사용할건 CallInfo와 텍스트를 호출하는 LOG와 Assert기능인 CHECK 매크로를 자주 사용하지 않을까 싶다.

 

 

참고: developstudy.tistory.com/40

 

언리얼(C++)에서 자주 사용하는 매크로 (언리얼 로그 찍기)

이득우 교수님의 언리얼 C++ 책을 참고해서 작성한 매크로 들인데 다른 프로젝트에서 유용히 쓸 수 있을것 같아서 여기에 공유한다. // HACKED.h (모듈최상위 헤더) // 이 함수가 호출된 함수의 이름

developstudy.tistory.com