파일 로그를 남겨보자
이제 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
소스와 같이 아주 간단하게 로그를 남길 수 있습니다.
spdlog는 open source formatting library인 fmt를 사용하고 있습니다.
formating 관련한 자세한 부분은 fmt 라이브러리를 참고하시면 됩니다.
7번째 라인처럼 문자열만 남길 수 있고,
8번째 ~ 9번째 라인처럼 {}, {0}, {1} 등을 통해서 값이나 변수를 출력할 수 있고
11번째 ~ 18번째 라인처럼 다양한 formatting을 지원하고 있습니다.
로그 레벨
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::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:29:58.737] [info] Info Level
[2022-07-16 17:29:58.740] [warning] Warn Level
[2022-07-16 17:29:58.741] [error] Error Level
[2022-07-16 17:29:58.741] [critical] Critical Level
소스 코드에서 Trace ~ Critical 까지 로그를 기록했는데, 실제 출력 결과는 Info ~ Critical 까지 출력됩니다.
spdlog::set_level 함수를 통해서 별도 지정하지 않는다면, 로그 레벨은 Info로 설정됩니다.
이제 로그 레벨을 변경해보겠습니다.
#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/rotating_file_sink.h"
#pragma comment(lib, "libspdlog_MD_2019_x86D_v1.10.0.lib")
int main()
{
auto max_size = 1024 * 1024 * 5; // 5MB
auto max_files = 3;
auto logger = spdlog::rotating_logger_mt("rotating", "logs/rotating.txt", max_size, max_files);
spdlog::set_default_logger(logger);
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 위키에서 확인할 수 있습니다.
📌 spdlog 위키 : https://github.com/gabime/spdlog/wiki
GitHub - gabime/spdlog: Fast C++ logging library.
Fast C++ logging library. Contribute to gabime/spdlog development by creating an account on GitHub.
github.com
'Open Source Library' 카테고리의 다른 글
[spdlog] 헤더 및 라이브러리 참조 (0) | 2022.07.16 |
---|---|
[spdlog] 소스 빌드하기 (0) | 2022.07.15 |
CMake 설치하기 (0) | 2022.07.01 |
Git 설치하기 ( 2.37.0 ) (0) | 2022.06.30 |