콘텐츠로 건너뛰기

[spdlog] 로그를 남겨보자 – spdlog 사용 방법

spdlog 라이브러리를 사용하여 다양한 형태로 로그를 남겨보겠습니다. 이번 포스트에서는 이전 포스트에서 만든 spdlog 라이브러리를 기반으로 spdlog 사용 방법 및 예시에 대해서 알아보도록 하겠습니다.

사전 준비 단계

이번 포스트는 spdlog 라이브러리를 사용할 수 있는 환경을 기반으로 합니다. 아직 준비가 안되었다면 아래 포스트를 참고하여 spdlog 라이브러리를 준비해야 합니다.

spdlog 사용 방법

로그 기록

콘솔 화면에 간단하게 로그를 남겨 보겠습니다.

#include "spdlog/spdlog.h"
 
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
 
int main()
{
    spdlog::info("Hello World!");
    spdlog::info("Age : {}", 42);
    spdlog::info("Between {1} and {0}", "Z", 0);
 
    spdlog::info("Notation Formatting int: {0:d}, hex: {0:x}, oct: {0:o}, bin: {0:b}", 42);
    spdlog::info("Padding 1 : {:8d}", 5);
    spdlog::info("Padding 2 : {:08x}", 5);
    spdlog::info("Floating 1 : {:08.1f}", 1.23456);
    spdlog::info("Floating 2 : {:08.2f}", 1.23456);
    spdlog::info("Floating 3 : {:8.1f}", 1.23456);
    spdlog::info("Floating 4 : {:8.2f}", 1.23456);
 
    return 0;
}
[2022-07-16 17:21:13.351] [info] Hello World!
[2022-07-16 17:21:13.355] [info] Age : 42
[2022-07-16 17:21:13.355] [info] Between 0 and Z
[2022-07-16 17:21:13.356] [info] Notation Formatting int: 42, hex: 2a, oct: 52, bin: 101010
[2022-07-16 17:21:13.356] [info] Padding 1 :        5
[2022-07-16 17:21:13.356] [info] Padding 2 : 00000005
[2022-07-16 17:21:13.357] [info] Floating 1 : 000001.2
[2022-07-16 17:21:13.357] [info] Floating 2 : 00001.23
[2022-07-16 17:21:13.357] [info] Floating 3 :      1.2
[2022-07-16 17:21:13.357] [info] Floating 4 :     1.23

소스와 같이 아주 간단하게 로그를 남길 수 있습니다.

7번째 라인처럼 문자열만 남길 수 있고, 

8번째 ~ 9번째 라인처럼 {}, {0}, {1} 등을 통해서 값이나 변수를 출력할 수 있고

11번째 ~ 18번째 라인처럼 다양한 formatting을 지원하고 있습니다.

spdlog는 open source formatting library인 fmt를 사용하고 있습니다.

formating 관련한 자세한 부분은 fmt 라이브러리를 참고하면 됩니다.

로그 레벨

spdlog는 다음과 같이 로그 레벨을 지원하며, 오른쪽으로 갈 수록 순위가 높습니다.

Trace – Debug – Info – Warning – Error – Critical

로그 레벨은 각각 다음 함수와 매칭됩니다.

◾ Trace – spdlog::trace

◾ Debug – spdlog::debug

◾ Info – spdlog::info

◾ Warning – spdlog::warn

◾ Error – spdlog::error

◾ Critical – spdlog::critical

spdlog::set_level 함수를 통해서 로그 레벨을 설정할 수 있으며, 설정한 로그 레벨을 포함하여 순위가 높은 로그 레벨만 출력합니다.

만약 다음과 같이 설정한다면 Error 보다 순위가 높은 Error와 Critical 만 출력합니다.

spdlog::set_level(spdlog::level::err);
#include "spdlog/spdlog.h"
 
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
 
int main()
{
    spdlog::set_level(spdlog::level::trace);
    spdlog::trace("Trace Level");
    spdlog::debug("Debug Level");
    spdlog::info("Info Level");
    spdlog::warn("Warn Level");
    spdlog::error("Error Level");
    spdlog::critical("Critical Level");
 
    return 0;
}
[2022-07-16 17:33:07.946] [trace] Trace Level
[2022-07-16 17:33:07.950] [debug] Debug Level
[2022-07-16 17:33:07.950] [info] Info Level
[2022-07-16 17:33:07.951] [warning] Warn Level
[2022-07-16 17:33:07.951] [error] Error Level
[2022-07-16 17:33:07.951] [critical] Critical Level

spdlog::set_level 함수를 사용하여 로그 레벨을 Trace로 변경하자 Trace ~ Critical 까지 출력되는 것을 확인할 수 있습니다.

만약, 로그를 남기고 싶지 않으면 다음과 같이 설정하면 됩니다.

spdlog::set_level(spdlog::level::off);

spdlog::set_level 함수를 사용하여 Release 빌드일 경우에는 Info ~ Critical 까지, Debug 빌드일 경우에는 Trace ~ Critical까지 출력할 수 있습니다.

매크로 방식으로 로그 남기기

함수를 사용 방식 대신에 매크로 방식으로 로그를 남길 수 있습니다.

#include "spdlog/spdlog.h"
 
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
 
int main()
{
    SPDLOG_TRACE("Trace Level");
    SPDLOG_DEBUG("Debug Level");
    SPDLOG_INFO("Info Level");
    SPDLOG_WARN("Warn Level");
    SPDLOG_ERROR("Error Level");
    SPDLOG_CRITICAL("Critical Level");
 
    return 0;
}

파일 로그 남기기

지금까지 화면에 로그를 남겼는데 파일로 로그를 남겨보겠습니다.

파일 로그도 아주 간단합니다. 헤더 파일을 추가하고, 파일 로거를 생성하고 기본 로거를 파일 로거로 지정하면 됩니다.

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
 
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
 
int main()
{
    auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
    spdlog::set_default_logger(logger);
 
    spdlog::trace("Trace Level");
    spdlog::debug("Debug Level");
    spdlog::info("Info Level");
    spdlog::warn("Warn Level");
    spdlog::error("Error Level");
    spdlog::critical("Critical Level");
 
    return 0;
}

최대 크기 지정

로그가 최대 크기가 넘어가면 다른 파일로 로그를 남기도록 설정할 수 있습니다.

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
 
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
 
int main()
{
    auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
    spdlog::set_default_logger(logger);
 
    spdlog::trace("Trace Level");
    spdlog::debug("Debug Level");
    spdlog::info("Info Level");
    spdlog::warn("Warn Level");
    spdlog::error("Error Level");
    spdlog::critical("Critical Level");
 
    return 0;
}

일자별 파일 로그 남기기 

일자별로 로그를 남기도록 설정할 수 있습니다.

#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"
 
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
 
int main()
{
    auto hour = 2;
    auto min = 30;
    
    // AM 2:30
    auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", hour, min);
 
    spdlog::set_default_logger(logger);
 
    return 0;
}

간단하게 spdlog 사용법에 대해서 알아보았습니다. 보다 자세한 내용은 spdlog 위키에서 확인할 수 있습니다.

참고 자료

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다