콘텐츠로 건너뛰기

[spdlog] spdlog 사용 방법

이번 포스트는 spdlog 라이브러리를 사용할 수 있는 환경을 기반으로 합니다.
[spdlog] spdlog 소스 빌드 및 참조

spdlog 라이브러리를 사용하면 다양한 형태로 로그를 남길 수 있습니다.

이번 포스팅에서는 spdlog 사용 방법 및 예시에 대해서 알아보도록 하겠습니다.

spdlog 사용 방법

Formatting

spdlog에서 Formatting은 open source formatting library인 fmt를 사용하고 있습니다.

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

#include "spdlog/spdlog.h"
  
int main()
{
    spdlog::info("Welcome to spdlog!");
    spdlog::info("Args : {}", 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("{:<30}", "left aligned");
    spdlog::info("{:>30}", "right aligned");
    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);
    
    spdlog::set_pattern("%^%l: %v%$");
 
    return 0;
}
실행 결과
[2024-09-30 12:22:58.974] [info] Welcome to spdlog!
[2024-09-30 12:22:58.975] [info] Args : 42
[2024-09-30 12:22:58.975] [info] Between 0 and Z
[2024-09-30 12:22:58.975] [info] Notation Formatting int: 42, hex: 2a, oct: 52, bin: 101010
[2024-09-30 12:22:58.976] [info] Padding 1 :        5
[2024-09-30 12:22:58.976] [info] Padding 2 : 00000005
[2024-09-30 12:22:58.976] [info] left aligned
[2024-09-30 12:22:58.977] [info]                  right aligned
[2024-09-30 12:22:58.977] [info] Floating 1 : 000001.2
[2024-09-30 12:22:58.977] [info] Floating 2 : 00001.23
[2024-09-30 12:22:58.978] [info] Floating 3 :      1.2
[2024-09-30 12:22:58.978] [info] Floating 4 :     1.23

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

5번째 라인처럼 문자열을 남길 수 있고, 

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

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

출력 패턴 변경

spdlog::set_pattern 함수를 사용하여 출력 패턴을 변경할 수 있습니다. 보다 자세한 내용은 Custom Formatting 문서를 참고하시길 바랍니다.

spdlog::set_pattern(pattern_string)

// Level: 로그 형태로 출력
spdlog::set_pattern("%^%l: %v%$");

// *** [12:53:29 +09:00] [thread 17340] 로그 ** 형태로 출력
spdlog::set_pattern("*** [%H:%M:%S %z] [thread %t] %v ***");

로그 레벨

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

Trace – Debug – Info – Warning – Error – Critical

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

함수매크로 함수
Tracespdlog::traceSPDLOG_TRACES
Debugspdlog::debugSPDLOG_DEBUG
Infospdlog::infoPDLOG_INFO
Warningspdlog::warnSPDLOG_WARN
Errorspdlog::errorSPDLOG_ERROR
Criticalspdlog::criticalSPDLOG_CRITICAL

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

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

spdlog::set_level(spdlog::level::err);

간단하게 로그 레벨 로그를 남겨보겠습니다.

#include "spdlog/spdlog.h"
 
int main()
{
    spdlog::set_level(spdlog::level::err);
    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;
}
실행 결과

[2024-09-30 12:28:32.952] [error] Error Level
[2024-09-30 12:28:32.953] [critical] Critical Level

spdlog::set_level 함수를 사용하여 로그 레벨을 Err로 변경하자 Error ~ 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"

int main()
{
    auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
    
    spdlog::set_default_logger(logger);
    spdlog::info("Basic File Logger");
    
    return 0;
}

최대 크기 지정

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

#include "spdlog/spdlog.h"
#include "spdlog/sinks/rotating_file_sink.h"
 
int main()
{
    auto max_size = 5 * 1024 * 1024;
    auto max_files = 3;
    
    // 5MB 넘어갈 경우 파일을 생성. 3개 파일을 반복하여 사용
    auto logger = spdlog::rotating_logger_mt("some_logger_name", "logs/rotating.txt", max_size, max_files);

    spdlog::set_default_logger(logger);
    spdlog::info("Rotating File Logger");
 
    return 0;
}

일자별 파일 로그 남기기 

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

#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"
 
int main()
{
    auto hour = 2;
    auto min = 30;
    
    // daily_YYYY-MM-DD.txt 파일 생성 ( 새벽 2시 30분에 )
    auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", hour, min);
 
    spdlog::set_default_logger(logger);
    spdlog::info("Daily File Logger");
 
    return 0;
}

flush

파일 로그 생성 시 로그가 실시간으로 기록되지 않을 수 있습니다. flush가 되지 않아서 발생하는 것으로 flush 주기 및 레벨을 설정할 수 있습니다.

spdlog::flush_every(std::chrono::seconds(3));  // 3초마다 갱신
spdlog::flush_on(spdlog::level::trace);        // trace 이상 항상 갱신

Backtrace 지원

Backtrace를 지원합니다. spdlog::enable_backtrace 함수에서 지정한 크기 만큼 메모리 상으로 로그를 가지고 있다가 spdlog::dump_backtrace() 사용 시 출력합니다.

spdlog::enable_backtrace(10);

for(int i = 0; i < 100; i++)
{
  spdlog::debug("Backtrace message {}", i); // not logged yet..
}

spdlog::dump_backtrace();
실행 결과
[2024-09-30 12:57:14.187] [info] ****************** Backtrace Start ******************
[2024-09-30 12:57:14.187] [debug] Backtrace message 90
[2024-09-30 12:57:14.187] [debug] Backtrace message 91
[2024-09-30 12:57:14.187] [debug] Backtrace message 92
[2024-09-30 12:57:14.187] [debug] Backtrace message 93
[2024-09-30 12:57:14.187] [debug] Backtrace message 94
[2024-09-30 12:57:14.187] [debug] Backtrace message 95
[2024-09-30 12:57:14.187] [debug] Backtrace message 96
[2024-09-30 12:57:14.187] [debug] Backtrace message 97
[2024-09-30 12:57:14.187] [debug] Backtrace message 98
[2024-09-30 12:57:14.187] [debug] Backtrace message 99
[2024-09-30 12:57:14.191] [info] ****************** Backtrace End ********************

마치며

spdlog 사용 방법에 대해서 알아보았습니다. spdlog를 사용하면 원하는 형태로 쉽게 로그를 남길 수 있습니다. 레지스트리나 설정 파일을 사용하여 로그 레벨을 조정하도록 설정하면 원하는 시점에 로그를 확인할 수 있습니다.

간단하게 사용할 수 있으므로 로그를 남긴다면 spdlog 로그를 사용해보세요. 🙏

참고 자료 및 사이트

답글 남기기

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

목차 보기