Coding Memo

Visual Studio glog 사용 본문

Language/C++

Visual Studio glog 사용

minttea25 2023. 10. 26. 19:57

로깅 라이브러리를 찾아보다가 한번 설치해보았다.


 

로깅을 위한 라이브러리로 C++14이상에서 작동한다.

Google에서 만든 라이브러리로, 규모가 큰 프로젝트에 적합하다. 다른 라이브러리와 마찬가지로 로깅 레벨(INFO, WARNING, ERROR, FATAL)을 설정가능하다. 또한 조건부 로깅이 가능하다. (특정 조건에 의해서만 로깅을 할 수 있다. 매크로로 처리된다.)

FATAL 로깅시에 해당을 로깅한 후에, 프로그램을 정지시키는 기능도 포함한다.

 

특징은 대용량 로그 처리가 가능하다는 것이라고 나와있다. 로그 파일을 자동을 분할하고 압축하는 기능을 제공하고 있다. 

 

다만, 그만큼 조금 무거운 라이브러리이다.

 

설치 방법은 공식 문서에도 나와 있다.

 

사용해 볼 기회가 언젠가 있지 않을...까?


1. Github에서 소스 파일을 가져온다. (Release 항목을 확인하자)

직접 다운로드 해도 되고, git으로 클론해도 된다.

https://github.com/google/glog

 

GitHub - google/glog: C++ implementation of the Google logging module

C++ implementation of the Google logging module. Contribute to google/glog development by creating an account on GitHub.

github.com

 

 

2. cmake로 프로젝트를 생성 한다.

 

- cmake GUI를 열어서 하기

설정 후 Generate를 눌러 빌드하면 된다. 자신이 사용하는 Visual Studio 버전에 맞게 빌드하자.

 

- cmd에서 cmake 실행

cmake -G "Visual Studio 16 2019" -B build -S .

Visual Studio 버전을 확인해서 하자.

 

 

3. 프로젝트를 Debug와 Release 버전으로 각각 빌드한다.

 

- Visual Studio에서 빌드

위 과정에서 빌드 결과 파일에 `glog.sln` 솔루션 파일이 있을 것이다. 이 솔루션을 열어서 Release와 Debug로 각각 솔루션을 build 해준다.

- cmd에서 cmake로 빌드

cmake --build build --config Release

cmake --build build --config Debug

아까 솔루션 생성시에 있던 위치에서 실행하면 된다.

 

 

4. 생성된 라이브러리 파일 및 헤더 파일을 확인한다.

 

Debug 디렉터리의 `glogd.dll`, `glogd.lib`

Release 디렉터리의 'glog.dll`, `glog.lib`

glog 디렉터리의 `export.h`, `logging.h`, `raw_logging.h`, `stl_logging.h`, `vlog_is_on.h`

 

추가로 다운로드 받았던(clone 했던) 폴더에서 src/glog 디렉터리 내에 있는 `log_severity.h`와 `platform.h`도 찾아주자.

 

 

5. 찾은 파일들을 프로젝트에 포함시킨다.

 

- 주의할 점은 몇몇 파일들을 직접 열어서 확인하면 헤더 파일 include 시작 위치가 glog 디렉터리인 것을 알 수 있을 것이다. 

따라서 프로젝트 소스 코드가 있는 위치에 glog라는 디렉터리를 생성후에 그 위치에다 위에서 찾은 헤더 파일 7개를 넣어주자.

 

- 정적 라이브러리 파일(.lib)은 솔루션 디렉터리의 적절하게 위치시키고 그 위치를 프로젝트 속성에서 참조하도록 하자.

 

ex) 기본 위치 (프로젝트 속성 - VC++ 디렉터리 - 라이브러리 디렉터리)에서 Debug 디렉터리 내에 있는 glogd.lib 및 Release 디렉터리 내에 있는 glog.lib 사용

#ifdef _DEBUG
#pragma comment(lib, "Debug\\glogd.lib")
#else
#pragma comment(lib, "Release\\glog.lib")
#endif

 

- 동적 라이브러리 파일(.dll)은 실행 파일(exe) 생성 위치에 위치 시킨다.

 

 

+ 컴파일 중에 아래와 같은 에러가 나타난다면

#include <glog/logging.h> 이전에 `#define GLOG_NO_ABBREVIATED_SEVERITIES`를 선언해주면 된다.

#define GLOG_NO_ABBREVIATED_SEVERITIES

#include <glog/logging.h>

테스트

 

#ifdef _DEBUG
#pragma comment(lib, "Debug\\glogd.lib")
#else
#pragma comment(lib, "Release\\glog.lib")
#endif

#define GLOG_NO_ABBREVIATED_SEVERITIES

#include <glog/logging.h>

#include <iostream>
#include <thread>

using namespace std;

int main()
{
    google::SetLogDestination(google::GLOG_INFO, "../Logs/TEST_LOG");
    FLAGS_alsologtostderr = 1; // console 도 출력

    google::InitGoogleLogging("log test");
    

    // INFO 로그 출력
    LOG(INFO) << "This is an INFO log message.";

    // WARNING 로그 출력
    LOG(WARNING) << "This is a WARNING log message.";

    // ERROR 로그 출력
    LOG(ERROR) << "This is an ERROR log message.";

    // FATAL 로그는 프로그램을 강제 종료시킨다.
    //LOG(FATAL) << "This is an FATAL log message.";

    google::ShutdownGoogleLogging();

    Sleep(1000);
}

다음과 같은 로그 파일이 생성된다.


물론, vcpkg로 직접 다운하여 옮겨도 된다.

vcpkg install glog:x64-windows