C++/공부

[C++/Console Engine] WinAPI로 커스텀 콘솔 엔진 구현하기(4) Log

왹져박사 2025. 1. 20. 10:36

이전 글!

2025.01.17 - [C++/공부] - [C++/Console Engine] WinAPI로 커스텀 콘솔 엔진 구현하기(3) Key 입력 정의 가져오기, 메모리 누수 검사 기능 추가

 

[C++/Console Engine] WinAPI로 커스텀 콘솔 엔진 구현하기(3) Key 입력 정의 가져오기, 메모리 누수 검사

2025.01.17 - [C++/공부] - [C++/Console Engine] WinAPI로 커스텀 콘솔 엔진 구현하기(2) PreCompiledHeader, DLL 헤더파일 추가와 매크로 [C++/Console Engine] WinAPI로 커스텀 콘솔 엔진 구현하기(2) PreCompiledHeader, DLL 헤더

narmhye.tistory.com

 

 

 

 

Unreal Engine  UE_LOG 문서

https://dev.epicgames.com/documentation/ko-kr/unreal-engine/logging-in-unreal-engine

 

Log 함수는 언리얼 공식 문서를 참고하며 이를 콘솔에 맞게 구현하려 했다. 

 

 

1. UE_LOG 알아보기

UE_LOG를 보면, 매개변수로 (로그 카테고리, 로그 레벨, 문자열 리터럴 포맷)을 받는다. 

로그 카테고리는 콘솔과 에디터에서의 출력에 관한 레벨 분류이고, 

로그 레벨(중요도)은 위 카테고리와 관련되지 않은 추가 레벨로,

로그파일 기록에 관한 시스템적인 추가 레벨 분류에 가까웠다. 

여기서는 C의 문자열 리터럴 포맷을 TEXT 매크로로  전달하도록 되어있다. 

 

로그 레벨에서 enum으로 Log, Warning, Error와 같이 로그 레벨을 입력할 수 있다. 

간단하게 기록과 로그 문자 컬러만 변경되도록 위 세 레벨만 추가해보기로 하였다. 

//로그 레벨 분류
enum ELogCategory
{
	Log,
	Warning,
	Error
};

 

 

2. 문자열 버퍼 구현하기

//로그 출력 창에 띄우기
template<typename... T>
inline void Log(ELogCategory category, const char* logTemp, T... args)
{
	//전달받은 문자열 주소값을 버퍼에 저장
	char buffer[512];
	snprintf(buffer, sizeof(buffer), logTemp, args ...);
	std::cout << buffer;
}

 

 

3. 콘솔 텍스트 색상 변경하기

강사님과 구현할때는 SetConsoleTextAttribute라는 함수를 사용했다. 

하지만 공식 문서를 보니, SetConsoleTextAttribute의 지원은 계속 하지만, 

최신 솔루션에서는 Console Virtual Terminal Sequences로 동작을 구현하기를 권장하고 있었다. 

 

다음은 커서 위치를 지정하는 규칙이다. 

wsdn 중

 

SGR 터미널 시퀀스 샘플 코드를 살펴보면, 

HANDLE과 DWORD를 설정한 뒤, wprintf로  출력하고 있다. 

실제 출력 텍스트를 제외한 내부를 살펴보면,

 L"\x1b[<n>~"로 구성되어 있다. 

여기서 \x1b[ 는 위의 규칙에 맞게 포함된 것을 알 수 있다. <n> 부분은 원하는 값을 넣으면 된다. 

궁금했던 점은 L이 무엇인가????였다. 

결론적으로 L 접두사를 사용하면 모든  ASCII 문자열 리터럴을 와이드 문자로 나타낼 수 있다고 한다. 

 

와이드 문자란,

일반적으로 1바이트를 차지하던 기존 ASCII 문자에서 2바이트를 차지하는 여러 언어들(한글 포함)을 안정적으로 지원하기 위해 사용하는 문자이다. wchar_t 형식을 사용한다. 기존 문자열 관련 함수들은 사용하지 못한다고 한다. 

따라서, 연산자 오버로딩을 하기로 했다. 

우선은 색 부분으로 다시 돌아가자. 

 

색 정의

문서에 나와있는 값들은 <consoleapi2.h>파일에 정의되어 있지만,

기존의 SetConsoleTextAttribute함수에서 사용하는 값으로 정의되어 있다.

 

이와 다르게 가상 터미널에서 사용할 색을 미리 정의해두겠다. 

문서에 나온 값 이외에도, 비트연산자로 색 조합을 정의하여 사용해도 된다. 

물론 공식 문서처럼 상수 값을 넣어도 된다. 

좀 더 직관적으로 알 수 있도록 정의하는 방법을 사용하려고 한다. 

이외에도 가상 터미널이 16이 넘는 색 팔레트를 지원한다면,

문서 내의 Extended Colors 부분과 같이 rgb에 값을 넣어 커스텀할 수 있다. 

다음과 같이 구현하였다. 

	//상세 로그 수준에 따른 출력 변화
	//색 변경하기, ESC: \x1b[
	switch (category)
	{
	case(ELogCategory::Log):
		std::cout << "\x1b[" << VT_FOREGROUND_WHITE_BRIGHT << buffer;
		break;
	case(ELogCategory::Warning):
		std::cout << "\x1b[" << VT_FOREGROUND_YELLOW << buffer;
		break;
	case(ELogCategory::Error):
		std::cout<< "\x1b[" << VT_FOREGROUND_RED << buffer;
		break;
	}

 

 

 

 

 

 

https://learn.microsoft.com/ko-kr/windows/win32/api/winnt/nf-winnt-text

 

TEXT 매크로(winnt.h) - Win32 apps

유니코드가 컴파일 중에 전처리기 지시문에 의해 정의되는 경우 문자열을 유니코드로 식별합니다. 그렇지 않으면 매크로는 문자열을 ANSI 문자열로 식별합니다.

learn.microsoft.com

 

 

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/snprintf-snprintf-snprintf-l-snwprintf-snwprintf-l?view=msvc-170

 

snprintf, _snprintf, _snprintf_l, _snwprintf, _snwprintf_l

snprintf, _snprintf, _snprintf_l, _snwprintf 및 _snwprintf_;에 대한 API 참조 형식이 지정된 데이터를 문자열에 쓰는 입니다.

learn.microsoft.com

 

 

https://learn.microsoft.com/ko-kr/cpp/cpp/ellipses-and-variadic-templates?view=msvc-170

 

Ellipsis 및 Variadic 템플릿

자세한 정보: 줄임표 및 variadic 템플릿

learn.microsoft.com

https://modoocode.com/290

 

씹어먹는 C++ - <9 - 2. 가변 길이 템플릿 (Variadic template)>

파라미터 팩(...)을 사용해서 임의의 개수의 인자를 받는 템플릿을 작성할 수 있습니다. C++ 17 에 새로 추가된 Fold 형식에 대해 배웠습니다.

modoocode.com

 

 

https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

 

Console Virtual Terminal Sequences - Windows Console

Virtual terminal sequences are control character sequences that can control cursor movement, color/font mode, and other operations when written to the output stream.

learn.microsoft.com

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/unicode-the-wide-character-set?view=msvc-170

 

유니코드: 와이드 문자 집합

Microsoft C 런타임의 유니코드 와이드 문자 집합을 소개합니다.

learn.microsoft.com