プログラム 技術

C++でログファイルを出力する

以前、C#でログファイルの出力について記載しましたが、今回はC++でのログファイルの出力となります
追加ライブラリなしのパターンと追加ライブラリありのパターンを紹介します
追加ライブラリはSPOLOGを使用します

以前の記事
C#でログファイルを実装する - ナストンのまとめ
C#でログファイルを実装する - ナストンのまとめ

今回はログファイルについてです。NLogを使おうと思っていたいのですが、いつの間にか非推奨(2024年11月現在)となっ ...

対象記事へ

名称バージョン
Visual Studio Community 202217.14.5
C++20
SPDLOGv1.x

ofstreamで書き出す

まずはライブラリを追加することなくofstreamを使って出力します
以下は出力関数となります

string NormalLog::GetCurrentTime() {
    time_t now = time(0);
    struct tm tstruct;
    char buf[80];
    localtime_s(&tstruct, &now);
    strftime(buf, sizeof(buf), "%Y-%m-%d %X", &tstruct);
    return buf;
}

void NormalLog::WriteLog(const string& message)
{
    ofstream logFile("log.txt", ios::app);
    if (!logFile.is_open()) {
        cerr << "ログファイルを開けませんでした。" << endl;
        return;
    }
    logFile << GetCurrentTime() << " - " << message << endl;
    logFile.close();
}

void NormalLog::WriteErrorLog(const string& message) {
    ofstream logFile("error_log.txt", ios::app);
    if (!logFile.is_open()) {
        cerr << "エラーログファイルを開けませんでした。" << endl;
        return;
    }
    logFile << GetCurrentTime() << "エラー: " << message << endl;
    logFile.close();
}

使い方としては通常のログファイル関数と似たような感じで通常時とエラー時で呼び出す関数を変えるだけとなります

NormalLog::WriteLog("TestLog");
NormalLog::WriteErrorLog("TestErrorLog");

SPOLOGで書き出す

SPOLOGは現在v2.xというバージョンもありますが、なぜかこのバージョンだと『basic_logger_mt』がないというエラーが発生しており調べても見つからなかったのでv1.xを使用しています

GitHub
GitHub - gabime/spdlog: Fast C++ logging library.
GitHub - gabime/spdlog: Fast C++ logging library.

Fast C++ logging library. Contribute to gabime/spdlog develo ...

GitHubへ

std::shared_ptr<spdlog::logger> SpdLog::file_logger_ = nullptr;
std::shared_ptr<spdlog::logger> SpdLog::error_logger_ = nullptr;

void SpdLog::Initialize() {
    static std::once_flag flag;
    std::call_once(flag, []() {
        file_logger_ = spdlog::basic_logger_mt("basic_logger", "spdlog.txt");
        error_logger_ = spdlog::basic_logger_mt("error_logger", "spderror_log.txt");
        });
}

void SpdLog::WriteLog(const std::string& message)
{
    Initialize();
    spdlog::info(message);
    file_logger_->info(message);
    file_logger_->flush();
}

void SpdLog::WriteErrorLog(const std::string& message) {
    Initialize();
    spdlog::error(message);
    error_logger_->error(message);
    error_logger_->flush();
}

使い方としては先ほど同様に通常のログファイル関数と似たような感じで通常時とエラー時で呼び出す関数を変えるだけとなります

SpdLog::WriteLog("SPDLog");
SpdLog::WriteErrorLog("SPDLogError");

以下のQiitaが詳しい使い方を記載しています

参考サイト
【C++】SPDLOGを用いて高速かつ安全にログを出力する #debug - Qiita
【C++】SPDLOGを用いて高速かつ安全にログを出力する #debug - Qiita

はじめに タイムスタンプ付きログを高速・安全に出力できる「SPDLOG」を業務で使う機会があったため、仕様・使い方をまと ...

サイトへ

SPDLOGの追加の仕方

Qiitaにも記載がありますが、こちらで詳しく書きます
VisualStudioの対象プロジェクトソリューションのプロジェクト>【プロジェクト名】のプロパティをクリック

構成プロパティ>C/C++>全般>追加のインクルードディレクトリ>【$(SolutionDir);】を追加します。これでSPDLOGを使用できるようになりました

error C2338: static_assert failed: 'Unicode supportというエラーが発生する

SPDLOGを含んで実行した際に「error C2338: static_assert failed: 'Unicode support requires compiling with /utf-8'」というエラーが発生して実行ができない状況が発生すると思います。調べたところ以下のサイトを見つけました
原因としてはutf-8でビルドする必要があったらしいです

参考サイト
spdlog.hを利用したソースコードをVisualStudioでコンパイルすると「error C2338: static_assert failed: 'Unicode support requires compiling with /utf-8'」になる - 物置き
spdlog.hを利用したソースコードをVisualStudioでコンパイルすると「error C2338: static_assert failed: 'Unicode support requires compiling with /utf-8'」になる - 物置き

個人で制作してるツールの中でspdlogというライブラリを利用しているが、 このツールのリポジトリにpushしたときに実 ...

サイトへ

VisualStudioで実行する際にutf-8のオプションを指定する方法は以下の通りです
先ほどの追加のと同じようにVisualStudioの対象プロジェクトソリューションのプロジェクト>【プロジェクト名】のプロパティをクリック

構成プロパティ>C/C++>コマンドライン>追加のオプション>【/utf-8】を追加します。これで問題なくVisualStudioで実行することができます

最後に

今回はC++でのログの書き出す方法について紹介しました。また、いつものごとくGitHubにサンプルコードをアップしていますので参考にしてください

GitHub
BlogSampleCodeProjects/Output_Logfile_Cpp at main · nasuton/BlogSampleCodeProjects · GitHub
BlogSampleCodeProjects/Output_Logfile_Cpp at main · nasuton/BlogSampleCodeProjects · GitHub

Project for sample code used in the blog.(Blogで記載しているサンプルコード ...

GitHubへ

会社紹介

私が所属しているアドバンスド・ソリューション株式会社(以下、ADS)は一緒に働く仲間を募集しています

会社概要
「技術」×「知恵」=顧客課題の解決・新しい価値の創造

この方程式の実現はADSが大切にしている考えで、技術を磨き続けるgeekさと、顧客を思うloveがあってこそ実現できる世界観だと思っています
この『love & geek』の精神さえあれば、得意不得意はno problem!
技術はピカイチだけど顧客折衝はちょっと苦手。OKです。技術はまだ未熟だけど顧客と知恵を出し合って要件定義するのは大好き。OKです
凸凹な社員の集まり、色んなカラーや柄の個性が集まっているからこそ、常に新しいソリューションが生まれています

ミッション
私たちは、テクノロジーを活用し、業務や事業の生産性向上と企業進化を支援します

ホームページ
アドバンスド・ソリューション株式会社|ADS Co., Ltd.
アドバンスド・ソリューション株式会社|ADS Co., Ltd.

Microsoft 365/SharePoint/Power Platform/Azure による DX コンサル・シス ...

サイトへ移動

PR

-プログラム, 技術
-