Skip to content

spdlogをWindowsで使う

C++ 用の超高速で多機能でヘッダオンリー(ヘッダだけ持ってくれば動く)な Logging ライブラリ。

spdlog
https://github.com/gabime/spdlog

Windows で雑に触ってみた結果、かなり良さげな印象。

とりあえず画面に出したいので出力先のコンソールを作る。

// コンソールを作成する(CodePageをUTF8にする)
AllocConsole();
SetConsoleOutputCP(CP_UTF8);

// Ctrl+Cでアプリケーションを終了させずにコンソールだけ閉じるようにする
SetConsoleCtrlHandler([](DWORD dwCtrlType) -> BOOL {
    if (dwCtrlType == CTRL_C_EVENT) {
        FreeConsole();
        return TRUE;
    }
    return FALSE;
}, TRUE);

// コンソールウィンドウのメニューから閉じる機能を外す
HMENU hmenu = GetSystemMenu(GetConsoleWindow(), FALSE);
RemoveMenu(hmenu, SC_CLOSE, MF_BYCOMMAND);

プリコンパイルヘッダ stdafx.h あたりに spdlog のヘッダを突っ込んでおく

// spdlogに対してWideCharを受け付け可能にする
#define SPDLOG_WCHAR_TO_UTF8_SUPPORT
#define SPDLOG_WCHAR_FILENAMES

// 出力ログレベルを設定する(Releaseモードではすべて外す)
#ifdef _DEBUG
    #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE
#else
    #define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_OFF
#endif

// ヘッダの導入は上記の定義の後にする事
#include <spdlog/spdlog.h>

ログを記録したい個所にコードを加えていく。

SPDLOG_INFO("Starting Program...");
SPDLOG_TRACE("fall through");
SPDLOG_DEBUG(L"何もしてないのに変わった変数:{}", nazoprm);
SPDLOG_CRITICAL("Critical Error. code:{} reason:{}", error_id, error_criteria);

コンソール出力にちゃんと色も付くね。
ただの Console ウィンドウなので、フォントやサイズはプロパティから変更すれば良い。

SPDLOG_* 系のマクロだけを使っている場合、SPDLOG_LEVEL_OFF にしてコンパイルすれば、プログラムフットプリントサイズに影響しないので、完全にデバッグ専用として使う事もできそう。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.