私たちは、元のログ記録を維持しながら、ログメッセージを別の形式(JSONやMQTT)へ再処理できるよう、ログにコールバックsinkを追加する必要がありました。C++標準を隅々まで知らなかったため、小さな落とし穴に気付きました。sinkを追加するときは、ロガーの sinks() へアクセスする方法に注意してください。次の方法では動作しません。

auto sinks = log_->sinks();
sinks.push_back(std::make_shared<spdlog::sinks::callback_sink<std::mutex> >([this](const spdlog::details::log_msg& msg) {this->LogCallback(msg);}));

"auto sinks = ..." はsinkのvectorのコピーを取得するため、ロガー内のsinkのvectorを変更していません。C++コンパイラーは、実際にはC++標準どおりに動作しています。"auto var = xyz" は参照を返すものではなく、右辺オブジェクトのコピーコンストラクターを呼び出します。

auto&、または common.h で定義されている元のsink_ptr型を使う必要があります。ただし、vectorへの参照でなければなりません。

auto& sinks = log_->sinks();
sinks.push_back( .....etc

この説明が、ほかの方の1時間の悩みを省ければ幸いです。


詳細は#3014を参照してください。