프로그램 개발 과정에서 중요한 점 중 하나가 디버깅이다. 릴리즈 이후 생기는 문제점은 로그를 통해 알아내야 한다.
기존에 만들어 쓰고 있던 로그가 있지만, C++로 spdlog라는걸 많이 쓴다고 해서 간단히 사용법을 알아본다.
검색결과 이 라이브러리가 어떤 라이브러리고 어쩌고는 다른곳에 많으니 패스하도록 하고, 사용법만 정리한다.
## 사용법
내가 파악한 spdlog는 sink와 logger 객체가 있다. sink는 로그 출력의 형태로 이해할 수 있으며, msvc_sink_mt, stdout_color_sink_mt, daily_file_sink_mt, rotating_file_sink_mt등이 있다. logger는 위의 클래스들을 묶어서 사용하거나 단일로 사용하는 실제 호출하는 객체이다.
FA에는 로그 사양이 존재하기도 하는데, 예를 들어 /년/월/일/시분초.log 같은 형식이다. spdlog에서 구현하고자 한다면, daily_file_format_sink_mt를 사용하여 다음과 같이 구현 가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
std::vector<spdlog::sink_ptr> sinks;
sinks.push_back(std::make_shared<spdlog::sinks::msvc_sink_mt>());
sinks.push_back(std::make_shared<spdlog::sinks::stdout_color_sink_mt>());
sinks.push_back(std::make_shared<spdlog::sinks::daily_file_format_sink_mt>("%Y/%m/%d/logfile_%H%M.txt", 0, 1, false, 5));
auto combined_logger = std::make_shared<spdlog::logger>("name", begin(sinks), end(sinks));
spdlog::register_logger(combined_logger);
spdlog::set_level(spdlog::level::trace);
spdlog::flush_on(spdlog::get_level());
spdlog::set_pattern("[%Y%m%d %H:%M:%S.%e][%n][%^%8l%$] [%!][%oms] %v");
SPDLOG_LOGGER_TRACE(combined_logger, "매크로 테스트 {}", i++);
위 예제는 VS2022 출력 창에 로그 출력, stdout에 로그출력, 매일 로그파일 생성 특징을 logger에 담아 출력하는 예제이다. spdlog 위키 페이지 예제를 참고하였으며, 매크로문으로 로그 출력을 한다면 호출 함수 까지도 로그에 자동으로 출력할 수 있다. 포멧팅으로 로그 출력 형식을 지정 하였고, 출력창에 색상도 지정이 가능하다.