생각의 기록

꿈꾸는 개발자 하늘고래의 프로그래밍 이야기

Open Source Library

[spdlog] 로그 남기기 (사용법)

하늘고래c 2022. 7. 16. 17:36
파일 로그를 남겨보자

 

이제 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