이번 포스트는 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
로그 레벨은 각각 다음 함수와 매칭됩니다.
함수 | 매크로 함수 | |
Trace | spdlog::trace | SPDLOG_TRACES |
Debug | spdlog::debug | SPDLOG_DEBUG |
Info | spdlog::info | PDLOG_INFO |
Warning | spdlog::warn | SPDLOG_WARN |
Error | spdlog::error | SPDLOG_ERROR |
Critical | spdlog::critical | SPDLOG_CRITICAL |
spdlog::set_level
함수를 통해서 로그 레벨을 설정할 수 있으며, 설정한 로그 레벨을 포함하여 순위가 높은 로그 레벨만 출력합니다.
만약 다음과 같이 설정한다면 Error
보다 순위가 높은 Error
와 Critical
만 출력합니다.
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 로그를 사용해보세요. 🙏
참고 자료 및 사이트
# 관련 포스트
# 참고 자료